This is a first-pass exploration of some of the relationships among QTS data for the “Spiritual curiosity” interview.

Time praying & spiritual experiences

Requested by Josh

Time praying as indexed by prayfreqmin

How many minutes each day do you do that on average throughout the week? [use real world examples, ask alone? With others? Probe away– Answer with interviewer judgement for answers]

prayfreqmin_count <- d %>%
  filter(!is.na(prayfreqmin), !is.na(godvoxaloud),
         prayfreqmin != "Other", godvoxaloud != "Other") %>%
  count(country, prayfreqmin) %>%
  data.frame()
prayfreqmin_count_by_quad <- d %>%
  filter(!is.na(prayfreqmin), !is.na(godvoxaloud),
         prayfreqmin != "Other", godvoxaloud != "Other") %>%
  count(country, urban_rural, charismatic_local, prayfreqmin) %>%
  data.frame()

Spiritual experiences indexed by godvoxaloud

Some people say that they have heard God* speak out loud to them. Has this ever happened to you?

d %>%
  filter(!is.na(prayfreqmin), !is.na(godvoxaloud)) %>% #,
         # prayfreqmin != "Other", godvoxaloud != "Other") %>%
  ggplot(aes(x = prayfreqmin, y = godvoxaloud, color = researcher)) +
  facet_grid(urban_rural ~ charismatic_local ~ country) +
  geom_point(alpha = 0.3, position = position_jitter(0.2, 0.2)) +
  scale_color_manual(values = custom_pal) +
  labs(title = paste("prayfreqmin", "godvoxaloud", sep = " x "),
       # subtitle = "Excluding people who did not have a clear answer",
       x = "prayfreqmin",
       y = "godvoxaloud",
       color = "Researcher") +
  theme_bw() +
  theme(legend.position = "top",
        axis.text.x = element_text(angle = 90, hjust = 1, vjust = 0.5)) +
  guides(color = guide_legend(ncol = 6, byrow = TRUE, 
                              override.aes = list(alpha = 1)))

d %>%
  filter(!is.na(prayfreqmin), !is.na(godvoxaloud),
         prayfreqmin != "Other", godvoxaloud != "Other") %>%
  ggplot(aes(x = prayfreqmin, alpha = godvoxaloud, fill = researcher)) +
  facet_grid(urban_rural ~ charismatic_local ~ country) +
  geom_bar(position = "fill") +
  geom_text(data = prayfreqmin_count_by_quad,
            aes(x = prayfreqmin, y = 1, alpha = NULL, fill = NULL,
                label = paste0("(n=", n, ")")),
            size = 2, nudge_y = 0.05) +
  # scale_fill_brewer(guide = NULL, palette = "Dark2") +
  scale_fill_manual(guide = NULL, values = custom_pal) +
  scale_alpha_discrete(range = c(0.5, 1)) +
  scale_y_continuous(breaks = seq(0, 1, 0.25)) +
  labs(title = paste("prayfreqmin", "godvoxaloud", sep = " x "),
       subtitle = "Excluding people who did not have a clear answer",
       x = "prayfreqmin",
       y = "Proportion",
       alpha = "godvoxaloud",
       fill = "Researcher") +
  theme_bw() +
  theme(legend.position = "top",
        axis.text.x = element_text(angle = 90, hjust = 1, vjust = 0.5)) +
  guides(alpha = guide_legend(),
         fill = "none")
Ignoring unknown aesthetics: fill

d %>%
  filter(!is.na(prayfreqmin), !is.na(godvoxaloud),
         prayfreqmin != "Other", godvoxaloud != "Other") %>%
  ggplot(aes(x = prayfreqmin, alpha = godvoxaloud, fill = country)) +
  facet_grid(. ~ country) +
  geom_bar(position = "fill") +
  geom_text(data = prayfreqmin_count,
            aes(x = prayfreqmin, y = 1, alpha = NULL, fill = NULL,
                label = paste0("(n=", n, ")")),
            size = 2, nudge_y = 0.05) +
  scale_fill_brewer(guide = NULL, palette = "Dark2") +
  # scale_fill_manual(guide = NULL, values = custom_pal) +
  scale_alpha_discrete(range = c(0.5, 1)) +
  scale_y_continuous(breaks = seq(0, 1, 0.25)) +
  labs(title = paste("prayfreqmin", "godvoxaloud", sep = " x "),
       subtitle = "Excluding people who did not have a clear answer",
       x = "prayfreqmin",
       y = "Proportion",
       alpha = "godvoxaloud",
       fill = "Researcher") +
  theme_bw() +
  theme(legend.position = "top",
        axis.text.x = element_text(angle = 90, hjust = 1, vjust = 0.5)) +
  guides(alpha = guide_legend(),
         fill = "none")
Ignoring unknown aesthetics: fill

d1 <- d %>%
  filter(!is.na(prayfreqmin), !is.na(godvoxaloud),
         prayfreqmin != "Other", godvoxaloud != "Other") %>%
  mutate(prayfreqmin_num = as.numeric(prayfreqmin) - 1,
         godvoxaloud = factor(godvoxaloud,
                               levels = c("No", "Yes")),
         godvoxaloud_num = as.numeric(godvoxaloud) - 1) %>%
  select(country, researcher, urban_rural, charismatic_local, subject_name,
         starts_with("prayfreqmin"), starts_with("godvoxaloud"))
contrasts(d1$country) <- cbind("GH" = c(-1, 1, 0, 0, 0),
                               "TH" = c(-1, 0, 1, 0, 0),
                               "CH" = c(-1, 0, 0, 1, 0),
                               "VT" = c(-1, 0, 0, 0, 1))
contrasts(d1$prayfreqmin) <- contr.poly(4)
r1 <- glm(godvoxaloud_num ~ prayfreqmin + country,
                  family = "binomial", data = d1)
summary(r1)

Call:
glm(formula = godvoxaloud_num ~ prayfreqmin + country, family = "binomial", 
    data = d1)

Deviance Residuals: 
   Min      1Q  Median      3Q     Max  
-1.703  -1.027  -0.455   1.032   2.154  

Coefficients:
              Estimate Std. Error z value Pr(>|z|)    
(Intercept)   -0.47926    0.13784  -3.477 0.000507 ***
prayfreqmin.L  0.73747    0.24453   3.016 0.002562 ** 
prayfreqmin.Q  0.54372    0.27178   2.001 0.045436 *  
prayfreqmin.C -0.35794    0.29205  -1.226 0.220347    
countryGH      0.97536    0.21961   4.441 8.94e-06 ***
countryTH      0.25817    0.26628   0.970 0.332274    
countryCH      0.30449    0.24600   1.238 0.215809    
countryVT      0.05578    0.25920   0.215 0.829609    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 446.17  on 328  degrees of freedom
Residual deviance: 385.93  on 321  degrees of freedom
AIC: 401.93

Number of Fisher Scoring iterations: 4

Spiritual experiences indexed by godviavisions

_Some people say that they have had a vision from God*—they have a picture, but it is like they see it with their eyes. Has anything like that happened to you?_

d %>%
  filter(!is.na(prayfreqmin), !is.na(godviavisions)) %>% #,
         # prayfreqmin != "Other", godviavisions != "Other") %>%
  ggplot(aes(x = prayfreqmin, y = godviavisions, color = researcher)) +
  facet_grid(urban_rural ~ charismatic_local ~ country) +
  geom_point(alpha = 0.3, position = position_jitter(0.2, 0.2)) +
  scale_color_manual(values = custom_pal) +
  labs(title = paste("prayfreqmin", "godviavisions", sep = " x "),
       # subtitle = "Excluding people who did not have a clear answer",
       x = "prayfreqmin",
       y = "godviavisions",
       color = "Researcher") +
  theme_bw() +
  theme(legend.position = "top",
        axis.text.x = element_text(angle = 90, hjust = 1, vjust = 0.5)) +
  guides(color = guide_legend(ncol = 6, byrow = TRUE, 
                              override.aes = list(alpha = 1)))

d %>%
  filter(!is.na(prayfreqmin), !is.na(godviavisions),
         prayfreqmin != "Other", godviavisions != "Other") %>%
  ggplot(aes(x = prayfreqmin, alpha = godviavisions, fill = researcher)) +
  facet_grid(urban_rural ~ charismatic_local ~ country) +
  geom_bar(position = "fill") +
  geom_text(data = prayfreqmin_count_by_quad,
            aes(x = prayfreqmin, y = 1, alpha = NULL, fill = NULL,
                label = paste0("(n=", n, ")")),
            size = 2, nudge_y = 0.05) +
  # scale_fill_brewer(guide = NULL, palette = "Dark2") +
  scale_fill_manual(guide = NULL, values = custom_pal) +
  scale_alpha_discrete(range = c(0.5, 1)) +
  scale_y_continuous(breaks = seq(0, 1, 0.25)) +
  labs(title = paste("prayfreqmin", "godviavisions", sep = " x "),
       subtitle = "Excluding people who did not have a clear answer",
       x = "prayfreqmin",
       y = "Proportion",
       alpha = "godviavisions",
       fill = "Researcher") +
  theme_bw() +
  theme(legend.position = "top",
        axis.text.x = element_text(angle = 90, hjust = 1, vjust = 0.5)) +
  guides(alpha = guide_legend(),
         fill = "none")
Ignoring unknown aesthetics: fill

d %>%
  filter(!is.na(prayfreqmin), !is.na(godviavisions),
         prayfreqmin != "Other", godviavisions != "Other") %>%
  ggplot(aes(x = prayfreqmin, alpha = godviavisions, fill = country)) +
  facet_grid(. ~ country) +
  geom_bar(position = "fill") +
  geom_text(data = prayfreqmin_count,
            aes(x = prayfreqmin, y = 1, alpha = NULL, fill = NULL,
                label = paste0("(n=", n, ")")),
            size = 2, nudge_y = 0.05) +
  scale_fill_brewer(guide = NULL, palette = "Dark2") +
  # scale_fill_manual(guide = NULL, values = custom_pal) +
  scale_alpha_discrete(range = c(0.5, 1)) +
  scale_y_continuous(breaks = seq(0, 1, 0.25)) +
  labs(title = paste("prayfreqmin", "godviavisions", sep = " x "),
       subtitle = "Excluding people who did not have a clear answer",
       x = "prayfreqmin",
       y = "Proportion",
       alpha = "godviavisions",
       fill = "Researcher") +
  theme_bw() +
  theme(legend.position = "top",
        axis.text.x = element_text(angle = 90, hjust = 1, vjust = 0.5)) +
  guides(alpha = guide_legend(),
         fill = "none")
Ignoring unknown aesthetics: fill

d2 <- d %>%
  filter(!is.na(prayfreqmin), !is.na(godviavisions),
         prayfreqmin != "Other", godviavisions != "Other") %>%
  mutate(prayfreqmin_num = as.numeric(prayfreqmin) - 1,
         godviavisions = factor(godviavisions,
                               levels = c("No", "Yes")),
         godviavisions_num = as.numeric(godviavisions) - 1) %>%
  select(country, researcher, urban_rural, charismatic_local, subject_name,
         starts_with("prayfreqmin"), starts_with("godviavisions"))
contrasts(d2$country) <- cbind("GH" = c(-1, 1, 0, 0, 0),
                               "TH" = c(-1, 0, 1, 0, 0),
                               "CH" = c(-1, 0, 0, 1, 0),
                               "VT" = c(-1, 0, 0, 0, 1))
contrasts(d2$prayfreqmin) <- contr.poly(4)
r2 <- glm(godviavisions_num ~ prayfreqmin + country,
                  family = "binomial", data = d2)
summary(r2)

Call:
glm(formula = godviavisions_num ~ prayfreqmin + country, family = "binomial", 
    data = d2)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-1.8640  -1.0136  -0.5422   1.1679   2.0691  

Coefficients:
              Estimate Std. Error z value Pr(>|z|)    
(Intercept)    -0.6210     0.1361  -4.562 5.06e-06 ***
prayfreqmin.L   0.9386     0.2470   3.800 0.000145 ***
prayfreqmin.Q   0.8468     0.2739   3.092 0.001989 ** 
prayfreqmin.C   0.3692     0.2926   1.262 0.207031    
countryGH       1.0290     0.2239   4.597 4.29e-06 ***
countryTH       0.6839     0.2719   2.515 0.011894 *  
countryCH      -0.9077     0.2933  -3.095 0.001968 ** 
countryVT       0.1282     0.2570   0.499 0.617930    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 443.63  on 334  degrees of freedom
Residual deviance: 386.58  on 327  degrees of freedom
AIC: 402.58

Number of Fisher Scoring iterations: 4

Spiritual experiences indexed by godviabodyexperiences

Some people have particular experiences in your body that they associate with God* or spirit. Does that happen for you? [examples: warm hands, goosebumps, fire in the belly]

d %>%
  filter(!is.na(prayfreqmin), !is.na(godviabodyexperiences)) %>% #,
         # prayfreqmin != "Other", godviabodyexperiences != "Other") %>%
  ggplot(aes(x = prayfreqmin, y = godviabodyexperiences, color = researcher)) +
  facet_grid(urban_rural ~ charismatic_local ~ country) +
  geom_point(alpha = 0.3, position = position_jitter(0.2, 0.2)) +
  scale_color_manual(values = custom_pal) +
  labs(title = paste("prayfreqmin", "godviabodyexperiences", sep = " x "),
       # subtitle = "Excluding people who did not have a clear answer",
       x = "prayfreqmin",
       y = "godviabodyexperiences",
       color = "Researcher") +
  theme_bw() +
  theme(legend.position = "top",
        axis.text.x = element_text(angle = 90, hjust = 1, vjust = 0.5)) +
  guides(color = guide_legend(ncol = 6, byrow = TRUE, 
                              override.aes = list(alpha = 1)))

d %>%
  filter(!is.na(prayfreqmin), !is.na(godviabodyexperiences),
         prayfreqmin != "Other", godviabodyexperiences != "Other") %>%
  ggplot(aes(x = prayfreqmin, alpha = godviabodyexperiences, fill = researcher)) +
  facet_grid(urban_rural ~ charismatic_local ~ country) +
  geom_bar(position = "fill") +
  geom_text(data = prayfreqmin_count_by_quad,
            aes(x = prayfreqmin, y = 1, alpha = NULL, fill = NULL,
                label = paste0("(n=", n, ")")),
            size = 2, nudge_y = 0.05) +
  # scale_fill_brewer(guide = NULL, palette = "Dark2") +
  scale_fill_manual(guide = NULL, values = custom_pal) +
  scale_alpha_discrete(range = c(0.5, 1)) +
  scale_y_continuous(breaks = seq(0, 1, 0.25)) +
  labs(title = paste("prayfreqmin", "godviabodyexperiences", sep = " x "),
       subtitle = "Excluding people who did not have a clear answer",
       x = "prayfreqmin",
       y = "Proportion",
       alpha = "godviabodyexperiences",
       fill = "Researcher") +
  theme_bw() +
  theme(legend.position = "top",
        axis.text.x = element_text(angle = 90, hjust = 1, vjust = 0.5)) +
  guides(alpha = guide_legend(),
         fill = "none")
Ignoring unknown aesthetics: fill

d %>%
  filter(!is.na(prayfreqmin), !is.na(godviabodyexperiences),
         prayfreqmin != "Other", godviabodyexperiences != "Other") %>%
  ggplot(aes(x = prayfreqmin, alpha = godviabodyexperiences, fill = country)) +
  facet_grid(. ~ country) +
  geom_bar(position = "fill") +
  geom_text(data = prayfreqmin_count,
            aes(x = prayfreqmin, y = 1, alpha = NULL, fill = NULL,
                label = paste0("(n=", n, ")")),
            size = 2, nudge_y = 0.05) +
  scale_fill_brewer(guide = NULL, palette = "Dark2") +
  # scale_fill_manual(guide = NULL, values = custom_pal) +
  scale_alpha_discrete(range = c(0.5, 1)) +
  scale_y_continuous(breaks = seq(0, 1, 0.25)) +
  labs(title = paste("prayfreqmin", "godviabodyexperiences", sep = " x "),
       subtitle = "Excluding people who did not have a clear answer",
       x = "prayfreqmin",
       y = "Proportion",
       alpha = "godviabodyexperiences",
       fill = "Researcher") +
  theme_bw() +
  theme(legend.position = "top",
        axis.text.x = element_text(angle = 90, hjust = 1, vjust = 0.5)) +
  guides(alpha = guide_legend(),
         fill = "none")
Ignoring unknown aesthetics: fill

d3 <- d %>%
  filter(!is.na(prayfreqmin), !is.na(godviabodyexperiences),
         prayfreqmin != "Other", godviabodyexperiences != "Other") %>%
  mutate(prayfreqmin_num = as.numeric(prayfreqmin) - 1,
         godviabodyexperiences = factor(godviabodyexperiences,
                               levels = c("No", "Yes")),
         godviabodyexperiences_num = as.numeric(godviabodyexperiences) - 1) %>%
  select(country, researcher, urban_rural, charismatic_local, subject_name,
         starts_with("prayfreqmin"), starts_with("godviabodyexperiences"))
contrasts(d3$country) <- cbind("GH" = c(-1, 1, 0, 0, 0),
                               "TH" = c(-1, 0, 1, 0, 0),
                               "CH" = c(-1, 0, 0, 1, 0),
                               "VT" = c(-1, 0, 0, 0, 1))
contrasts(d3$prayfreqmin) <- contr.poly(4)
r3 <- glm(godviabodyexperiences_num ~ prayfreqmin + country,
                  family = "binomial", data = d3)
summary(r3)

Call:
glm(formula = godviabodyexperiences_num ~ prayfreqmin + country, 
    family = "binomial", data = d3)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-2.0197  -1.1520   0.6754   0.8918   1.3475  

Coefficients:
              Estimate Std. Error z value Pr(>|z|)    
(Intercept)     0.7061     0.1332   5.302 1.14e-07 ***
prayfreqmin.L   0.5249     0.2378   2.207  0.02731 *  
prayfreqmin.Q   0.5157     0.2622   1.966  0.04926 *  
prayfreqmin.C   0.2188     0.2779   0.788  0.43096    
countryGH       0.5353     0.2375   2.254  0.02418 *  
countryTH       0.8843     0.3073   2.877  0.00401 ** 
countryCH      -0.4790     0.2488  -1.926  0.05415 .  
countryVT      -0.1303     0.2500  -0.521  0.60225    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 432.22  on 334  degrees of freedom
Residual deviance: 402.36  on 327  degrees of freedom
AIC: 418.36

Number of Fisher Scoring iterations: 4

Aggregate spiritual experiences score

d_spirit %>%
  filter(!is.na(prayfreqmin), !is.na(spex_score)) %>%
  distinct(country, researcher, urban_rural, charismatic_local,
           subject_name, prayfreqmin, spex_score) %>%
  ggplot(aes(x = prayfreqmin, y = spex_score, color = researcher)) +
  facet_grid(urban_rural ~ charismatic_local ~ country) +
  geom_point(alpha = 0.3, position = position_jitter(0.2, 0)) +
  scale_color_manual(values = custom_pal) +
  labs(title = paste("prayfreqmin", "spex_score", sep = " x "),
       # subtitle = "Excluding people who did not have a clear answer",
       x = "prayfreqmin",
       y = "spex_score",
       color = "Researcher") +
  theme_bw() +
  theme(legend.position = "top",
        axis.text.x = element_text(angle = 90, hjust = 1, vjust = 0.5)) +
  guides(color = guide_legend(ncol = 6, byrow = TRUE, 
                              override.aes = list(alpha = 1)))

d_spirit %>%
  filter(!is.na(prayfreqmin), !is.na(spex_score)) %>%
  distinct(country, researcher, urban_rural, charismatic_local,
           subject_name, prayfreqmin, spex_score) %>%
  ggplot(aes(x = prayfreqmin, y = spex_score, 
             color = country, fill = country, group = country)) +
  facet_grid(. ~ country) +
  geom_point(alpha = 0.3, position = position_jitter(0.2, 0)) +
  geom_smooth(aes(x = as.numeric(prayfreqmin)), method = "lm") +
  # geom_smooth(aes(x = as.numeric(prayfreqmin)), method = "loess") +
  # scale_color_manual(values = custom_pal) +
  # scale_fill_manual(values = custom_pal) +
  scale_color_brewer(palette = "Dark2") +
  scale_fill_brewer(palette = "Dark2") +
  labs(title = paste("prayfreqmin", "spex_score", sep = " x "),
       # subtitle = "Excluding people who did not have a clear answer",
       x = "prayfreqmin",
       y = "spex_score",
       color = "Researcher", fill = "Researcher") +
  theme_bw() +
  theme(legend.position = "top",
        axis.text.x = element_text(angle = 90, hjust = 1, vjust = 0.5)) +
  guides(color = guide_legend(ncol = 6, byrow = TRUE, 
                              override.aes = list(alpha = 1)),
         fill = guide_legend(ncol = 6, byrow = TRUE))

d_agg1 <- d_spirit %>%
  filter(!is.na(prayfreqmin), !is.na(spex_score),
         prayfreqmin != "Other", spex_score != "Other") %>%
  # distinct(country, researcher, urban_rural, charismatic_local,
  #          subject_name, prayfreqmin, spex_score) %>%
  mutate(prayfreqmin_num = as.numeric(prayfreqmin) - 1) # %>%
  # select(country, researcher, urban_rural, charismatic_local, subject_name,
  #        starts_with("prayfreqmin"), starts_with("spex_score"))
contrasts(d_agg1$country) <- cbind("GH" = c(-1, 1, 0, 0, 0),
                               "TH" = c(-1, 0, 1, 0, 0),
                               "CH" = c(-1, 0, 0, 1, 0),
                               "VT" = c(-1, 0, 0, 0, 1))
contrasts(d_agg1$prayfreqmin) <- contr.poly(4)
r_agg1 <- lmer(response ~ prayfreqmin + country 
               + (1 | subject_name) + (1 | question), 
               data = d_agg1)
summary(r_agg1)
Linear mixed model fit by REML ['lmerMod']
Formula: response ~ prayfreqmin + country + (1 | subject_name) + (1 |  
    question)
   Data: d_agg1

REML criterion at convergence: 9516

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-2.6638 -0.7863 -0.1873  0.8822  2.5579 

Random effects:
 Groups       Name        Variance Std.Dev.
 subject_name (Intercept) 0.02090  0.1446  
 question     (Intercept) 0.03517  0.1875  
 Residual                 0.17972  0.4239  
Number of obs: 7961, groups:  subject_name, 344; question, 24

Fixed effects:
               Estimate Std. Error t value
(Intercept)    0.459403   0.039550  11.616
prayfreqmin.L  0.117263   0.017788   6.592
prayfreqmin.Q  0.033800   0.019728   1.713
prayfreqmin.C  0.048443   0.021485   2.255
countryGH      0.024153   0.016975   1.423
countryTH      0.001581   0.020844   0.076
countryCH     -0.086277   0.019517  -4.421
countryVT      0.155426   0.019417   8.005

Correlation of Fixed Effects:
            (Intr) pryf.L pryf.Q pryf.C cntrGH cntrTH cntrCH
prayfrqmn.L  0.035                                          
prayfrqmn.Q -0.066  0.174                                   
prayfrqmn.C  0.024 -0.164 -0.026                            
countryGH   -0.045 -0.099  0.114  0.118                     
countryTH    0.034  0.240  0.040 -0.020 -0.259              
countryCH    0.014 -0.076 -0.095 -0.034 -0.227 -0.305       
countryVT    0.004 -0.045  0.058 -0.022 -0.209 -0.299 -0.278
r_agg2 <- lmer(response ~ prayfreqmin * country 
               + (1 | subject_name) + (1 | question), 
               data = d_agg1)
summary(r_agg2)
Linear mixed model fit by REML ['lmerMod']
Formula: response ~ prayfreqmin * country + (1 | subject_name) + (1 |  
    question)
   Data: d_agg1

REML criterion at convergence: 9563.5

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-2.6672 -0.7887 -0.1796  0.8787  2.5708 

Random effects:
 Groups       Name        Variance Std.Dev.
 subject_name (Intercept) 0.02118  0.1455  
 question     (Intercept) 0.03517  0.1875  
 Residual                 0.17973  0.4239  
Number of obs: 7961, groups:  subject_name, 344; question, 24

Fixed effects:
                         Estimate Std. Error t value
(Intercept)              0.458378   0.039986  11.463
prayfreqmin.L            0.108947   0.022863   4.765
prayfreqmin.Q            0.026234   0.023102   1.136
prayfreqmin.C            0.042343   0.023338   1.814
countryGH                0.027652   0.018607   1.486
countryTH               -0.012737   0.030968  -0.411
countryCH               -0.075852   0.022478  -3.374
countryVT                0.153817   0.020838   7.381
prayfreqmin.L:countryGH  0.006461   0.035854   0.180
prayfreqmin.Q:countryGH  0.003627   0.037213   0.097
prayfreqmin.C:countryGH  0.023226   0.038524   0.603
prayfreqmin.L:countryTH -0.039139   0.069967  -0.559
prayfreqmin.Q:countryTH -0.016074   0.061933  -0.260
prayfreqmin.C:countryTH  0.009706   0.052689   0.184
prayfreqmin.L:countryCH -0.029814   0.038224  -0.780
prayfreqmin.Q:countryCH -0.039246   0.044956  -0.873
prayfreqmin.C:countryCH  0.018775   0.050805   0.370
prayfreqmin.L:countryVT -0.012807   0.039717  -0.322
prayfreqmin.Q:countryVT  0.036971   0.041676   0.887
prayfreqmin.C:countryVT  0.035715   0.043548   0.820

Correlation matrix not shown by default, as p = 20 > 12.
Use print(x, correlation=TRUE)  or
     vcov(x)     if you need it
anova(r_agg1, r_agg2)
refitting model(s) with ML (instead of REML)
Data: d_agg1
Models:
r_agg1: response ~ prayfreqmin + country + (1 | subject_name) + (1 | 
r_agg1:     question)
r_agg2: response ~ prayfreqmin * country + (1 | subject_name) + (1 | 
r_agg2:     question)
       Df    AIC    BIC  logLik deviance Chisq Chi Df Pr(>Chisq)
r_agg1 11 9489.8 9566.6 -4733.9   9467.8                        
r_agg2 23 9504.7 9665.3 -4729.3   9458.7 9.134     12     0.6914
d_r_agg1_predicted <- d_agg1 %>%
  mutate(response_pred = predict(r_agg1, d_agg1)) %>%
  group_by(subject_name) %>%
  mutate(spex_score_pred = sum(response_pred, na.rm = T)) %>%
  ungroup() %>%
  group_by(country, prayfreqmin) %>%
  do(data.frame(rbind(smean.cl.boot(.$spex_score_pred))))
d_spirit %>%
  filter(!is.na(prayfreqmin), !is.na(spex_score)) %>%
  distinct(country, researcher, urban_rural, charismatic_local,
           subject_name, prayfreqmin, spex_score) %>%
  ggplot(aes(x = prayfreqmin, y = spex_score, 
             color = country, fill = country, group = country)) +
  facet_grid(. ~ country) +
  geom_point(alpha = 0.3, position = position_jitter(0.2, 0)) +
  geom_line(data = d_r_agg1_predicted, aes(y = Mean)) +
  geom_ribbon(data = d_r_agg1_predicted, 
              aes(ymin = Lower, ymax = Upper, y = NULL), 
              alpha = 0.5, size = 0) +
  # scale_color_manual(values = custom_pal) +
  # scale_fill_manual(values = custom_pal) +
  scale_color_brewer(palette = "Dark2") +
  scale_fill_brewer(palette = "Dark2") +
  labs(title = paste("prayfreqmin", "spex_score", sep = " x "),
       subtitle = "Lines are predictions from a mixed effects linear regression:\nlmer(response ~ prayfreqmin + country + (1 | subject_name) + (1 | question)",
       x = "prayfreqmin",
       y = "spex_score",
       color = "Site", fill = "Site") +
  theme_bw() +
  theme(legend.position = "top",
        axis.text.x = element_text(angle = 90, hjust = 1, vjust = 0.5)) +
  guides(color = "none",
         fill = "none")
Ignoring unknown aesthetics: y

Looking just at ‘apples’ (urban charismatics)

d_spirit %>%
  filter(!is.na(prayfreqmin), !is.na(spex_score),
         quad == "urban charismatic") %>%
  distinct(country, researcher, charismatic_local, urban_rural, 
           subject_name, prayfreqmin, spex_score) %>%
  ggplot(aes(x = prayfreqmin, y = spex_score, 
             color = country, fill = country, group = country)) +
  facet_grid(charismatic_local ~ urban_rural ~ country) +
  geom_point(alpha = 0.3, position = position_jitter(0.2, 0)) +
  geom_smooth(method = "lm") +
  # scale_color_manual(values = custom_pal) +
  # scale_fill_manual(values = custom_pal) +
  scale_color_brewer(palette = "Dark2") +
  scale_fill_brewer(palette = "Dark2") +
  labs(title = paste("prayfreqmin", "spex_score", sep = " x "),
       # subtitle = "Lines are predictions from a mixed effects linear regression:\nlmer(response ~ prayfreqmin + country + (1 | subject_name) + (1 | question)",
       x = "prayfreqmin",
       y = "spex_score",
       color = "Site", fill = "Site") +
  theme_bw() +
  theme(legend.position = "top",
        axis.text.x = element_text(angle = 90, hjust = 1, vjust = 0.5)) +
  guides(color = "none",
         fill = "none")

Looking at all charismatics

d_spirit %>%
  filter(!is.na(prayfreqmin), !is.na(spex_score),
         charismatic_local == "charismatic") %>%
  distinct(country, researcher, charismatic_local, urban_rural, 
           subject_name, prayfreqmin, spex_score) %>%
  ggplot(aes(x = prayfreqmin, y = spex_score, 
             color = country, fill = country, group = country)) +
  facet_grid(charismatic_local ~ country) +
  geom_point(alpha = 0.3, position = position_jitter(0.2, 0)) +
  geom_smooth(method = "lm") +
  # scale_color_manual(values = custom_pal) +
  # scale_fill_manual(values = custom_pal) +
  scale_color_brewer(palette = "Dark2") +
  scale_fill_brewer(palette = "Dark2") +
  labs(title = paste("prayfreqmin", "spex_score", sep = " x "),
       # subtitle = "Lines are predictions from a mixed effects linear regression:\nlmer(response ~ prayfreqmin + country + (1 | subject_name) + (1 | question)",
       x = "prayfreqmin",
       y = "spex_score",
       color = "Site", fill = "Site") +
  theme_bw() +
  theme(legend.position = "top",
        axis.text.x = element_text(angle = 90, hjust = 1, vjust = 0.5)) +
  guides(color = "none",
         fill = "none")

Doubt & external sensory experiences

Requested by Emily, John

“Doubt” indxed by selfunsuregodreal

Has there been a time when you yourself wondered whether God* was real?

selfunsuregodreal_count <- d %>%
  filter(!is.na(selfunsuregodreal), !is.na(godvoxaloud),
         selfunsuregodreal != "Other", godvoxaloud != "Other") %>%
  count(country, selfunsuregodreal) %>%
  data.frame()
selfunsuregodreal_count_by_quad <- d %>%
  filter(!is.na(selfunsuregodreal), !is.na(godvoxaloud),
         selfunsuregodreal != "Other", godvoxaloud != "Other") %>%
  count(country, urban_rural, charismatic_local, selfunsuregodreal) %>%
  data.frame()

Spiritual experiences indexed by godvoxaloud

Some people say that they have heard God* speak out loud to them. Has this ever happened to you?

d %>%
  filter(!is.na(selfunsuregodreal), !is.na(godvoxaloud)) %>% #,
         # selfunsuregodreal != "Other", godvoxaloud != "Other") %>%
  ggplot(aes(x = selfunsuregodreal, y = godvoxaloud, color = researcher)) +
  facet_grid(urban_rural ~ charismatic_local ~ country) +
  geom_point(alpha = 0.3, position = position_jitter(0.2, 0.2)) +
  scale_color_manual(values = custom_pal) +
  labs(title = paste("selfunsuregodreal", "godvoxaloud", sep = " x "),
       # subtitle = "Excluding people who did not have a clear answer",
       x = "selfunsuregodreal",
       y = "godvoxaloud",
       color = "Researcher") +
  theme_bw() +
  theme(legend.position = "top",
        axis.text.x = element_text(angle = 90, hjust = 1, vjust = 0.5)) +
  guides(color = guide_legend(ncol = 6, byrow = TRUE, 
                              override.aes = list(alpha = 1)))

d %>%
  filter(!is.na(selfunsuregodreal), !is.na(godvoxaloud),
         selfunsuregodreal != "Other", godvoxaloud != "Other") %>%
  ggplot(aes(x = selfunsuregodreal, alpha = godvoxaloud, fill = researcher)) +
  facet_grid(urban_rural ~ charismatic_local ~ country) +
  geom_bar(position = "fill") +
  geom_text(data = selfunsuregodreal_count_by_quad,
            aes(x = selfunsuregodreal, y = 1, alpha = NULL, fill = NULL,
                label = paste0("(n=", n, ")")),
            size = 2, nudge_y = 0.05) +
  # scale_fill_brewer(guide = NULL, palette = "Dark2") +
  scale_fill_manual(guide = NULL, values = custom_pal) +
  scale_alpha_discrete(range = c(0.5, 1)) +
  scale_y_continuous(breaks = seq(0, 1, 0.25)) +
  labs(title = paste("selfunsuregodreal", "godvoxaloud", sep = " x "),
       subtitle = "Excluding people who did not have a clear answer",
       x = "selfunsuregodreal",
       y = "Proportion",
       alpha = "godvoxaloud",
       fill = "Researcher") +
  theme_bw() +
  theme(legend.position = "top",
        axis.text.x = element_text(angle = 90, hjust = 1, vjust = 0.5)) +
  guides(alpha = guide_legend(),
         fill = "none")
Ignoring unknown aesthetics: fill

d %>%
  filter(!is.na(selfunsuregodreal), !is.na(godvoxaloud),
         selfunsuregodreal != "Other", godvoxaloud != "Other") %>%
  ggplot(aes(x = selfunsuregodreal, alpha = godvoxaloud, fill = country)) +
  facet_grid(. ~ country) +
  geom_bar(position = "fill") +
  geom_text(data = selfunsuregodreal_count,
            aes(x = selfunsuregodreal, y = 1, alpha = NULL, fill = NULL,
                label = paste0("(n=", n, ")")),
            size = 2, nudge_y = 0.05) +
  scale_fill_brewer(guide = NULL, palette = "Dark2") +
  # scale_fill_manual(guide = NULL, values = custom_pal) +
  scale_alpha_discrete(range = c(0.5, 1)) +
  scale_y_continuous(breaks = seq(0, 1, 0.25)) +
  labs(title = paste("selfunsuregodreal", "godvoxaloud", sep = " x "),
       subtitle = "Excluding people who did not have a clear answer",
       x = "selfunsuregodreal",
       y = "Proportion",
       alpha = "godvoxaloud",
       fill = "Researcher") +
  theme_bw() +
  theme(legend.position = "top",
        axis.text.x = element_text(angle = 90, hjust = 1, vjust = 0.5)) +
  guides(alpha = guide_legend(),
         fill = "none")
Ignoring unknown aesthetics: fill

d4 <- d %>%
  filter(!is.na(selfunsuregodreal), !is.na(godvoxaloud),
         selfunsuregodreal != "Other", godvoxaloud != "Other",
         selfunsuregodreal != "Maybe") %>%
  mutate(selfunsuregodreal = factor(selfunsuregodreal,
                                    levels = c("No", "Yes")),
         selfunsuregodreal_num = as.numeric(selfunsuregodreal) - 1,
         godvoxaloud = factor(godvoxaloud,
                               levels = c("No", "Yes")),
         godvoxaloud_num = as.numeric(godvoxaloud) - 1) %>%
  select(country, researcher, urban_rural, charismatic_local, subject_name,
         starts_with("selfunsuregodreal"), starts_with("godvoxaloud"))
contrasts(d4$country) <- cbind("GH" = c(-1, 1, 0, 0, 0),
                               "TH" = c(-1, 0, 1, 0, 0),
                               "CH" = c(-1, 0, 0, 1, 0),
                               "VT" = c(-1, 0, 0, 0, 1))
contrasts(d4$selfunsuregodreal) <- cbind("Y" = c(-1, 1))
r4 <- glm(godvoxaloud_num ~ selfunsuregodreal + country,
                  family = "binomial", data = d4)
summary(r4)

Call:
glm(formula = godvoxaloud_num ~ selfunsuregodreal + country, 
    family = "binomial", data = d4)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-1.4270  -1.0266  -0.5155   0.9986   2.0415  

Coefficients:
                   Estimate Std. Error z value Pr(>|z|)    
(Intercept)        -0.47400    0.12983  -3.651 0.000261 ***
selfunsuregodrealY -0.06683    0.13151  -0.508 0.611315    
countryGH           0.97704    0.21634   4.516 6.29e-06 ***
countryTH           0.01075    0.26818   0.040 0.968028    
countryCH           0.38097    0.24572   1.550 0.121032    
countryVT           0.04141    0.26124   0.159 0.874046    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 426.65  on 313  degrees of freedom
Residual deviance: 381.81  on 308  degrees of freedom
AIC: 393.81

Number of Fisher Scoring iterations: 4

Spiritual experiences indexed by godviavisions

_Some people say that they have had a vision from God*—they have a picture, but it is like they see it with their eyes. Has anything like that happened to you?_

d %>%
  filter(!is.na(selfunsuregodreal), !is.na(godviavisions)) %>% #,
         # selfunsuregodreal != "Other", godviavisions != "Other") %>%
  ggplot(aes(x = selfunsuregodreal, y = godviavisions, color = researcher)) +
  facet_grid(urban_rural ~ charismatic_local ~ country) +
  geom_point(alpha = 0.3, position = position_jitter(0.2, 0.2)) +
  scale_color_manual(values = custom_pal) +
  labs(title = paste("selfunsuregodreal", "godviavisions", sep = " x "),
       # subtitle = "Excluding people who did not have a clear answer",
       x = "selfunsuregodreal",
       y = "godviavisions",
       color = "Researcher") +
  theme_bw() +
  theme(legend.position = "top",
        axis.text.x = element_text(angle = 90, hjust = 1, vjust = 0.5)) +
  guides(color = guide_legend(ncol = 6, byrow = TRUE, 
                              override.aes = list(alpha = 1)))

d %>%
  filter(!is.na(selfunsuregodreal), !is.na(godviavisions),
         selfunsuregodreal != "Other", godviavisions != "Other") %>%
  ggplot(aes(x = selfunsuregodreal, alpha = godviavisions, fill = researcher)) +
  facet_grid(urban_rural ~ charismatic_local ~ country) +
  geom_bar(position = "fill") +
  geom_text(data = selfunsuregodreal_count_by_quad,
            aes(x = selfunsuregodreal, y = 1, alpha = NULL, fill = NULL,
                label = paste0("(n=", n, ")")),
            size = 2, nudge_y = 0.05) +
  # scale_fill_brewer(guide = NULL, palette = "Dark2") +
  scale_fill_manual(guide = NULL, values = custom_pal) +
  scale_alpha_discrete(range = c(0.5, 1)) +
  scale_y_continuous(breaks = seq(0, 1, 0.25)) +
  labs(title = paste("selfunsuregodreal", "godviavisions", sep = " x "),
       subtitle = "Excluding people who did not have a clear answer",
       x = "selfunsuregodreal",
       y = "Proportion",
       alpha = "godviavisions",
       fill = "Researcher") +
  theme_bw() +
  theme(legend.position = "top",
        axis.text.x = element_text(angle = 90, hjust = 1, vjust = 0.5)) +
  guides(alpha = guide_legend(),
         fill = "none")
Ignoring unknown aesthetics: fill

d %>%
  filter(!is.na(selfunsuregodreal), !is.na(godviavisions),
         selfunsuregodreal != "Other", godviavisions != "Other") %>%
  ggplot(aes(x = selfunsuregodreal, alpha = godviavisions, fill = country)) +
  facet_grid(. ~ country) +
  geom_bar(position = "fill") +
  geom_text(data = selfunsuregodreal_count,
            aes(x = selfunsuregodreal, y = 1, alpha = NULL, fill = NULL,
                label = paste0("(n=", n, ")")),
            size = 2, nudge_y = 0.05) +
  scale_fill_brewer(guide = NULL, palette = "Dark2") +
  # scale_fill_manual(guide = NULL, values = custom_pal) +
  scale_alpha_discrete(range = c(0.5, 1)) +
  scale_y_continuous(breaks = seq(0, 1, 0.25)) +
  labs(title = paste("selfunsuregodreal", "godviavisions", sep = " x "),
       subtitle = "Excluding people who did not have a clear answer",
       x = "selfunsuregodreal",
       y = "Proportion",
       alpha = "godviavisions",
       fill = "Researcher") +
  theme_bw() +
  theme(legend.position = "top",
        axis.text.x = element_text(angle = 90, hjust = 1, vjust = 0.5)) +
  guides(alpha = guide_legend(),
         fill = "none")
Ignoring unknown aesthetics: fill

d5 <- d %>%
  filter(!is.na(selfunsuregodreal), !is.na(godviavisions),
         selfunsuregodreal != "Other", godviavisions != "Other",
         selfunsuregodreal != "Maybe") %>%
  mutate(selfunsuregodreal = factor(selfunsuregodreal,
                                    levels = c("No", "Yes")),
         selfunsuregodreal_num = as.numeric(selfunsuregodreal) - 1,
         godviavisions = factor(godviavisions,
                               levels = c("No", "Yes")),
         godviavisions_num = as.numeric(godviavisions) - 1) %>%
  select(country, researcher, urban_rural, charismatic_local, subject_name,
         starts_with("selfunsuregodreal"), starts_with("godviavisions"))
contrasts(d5$country) <- cbind("GH" = c(-1, 1, 0, 0, 0),
                               "TH" = c(-1, 0, 1, 0, 0),
                               "CH" = c(-1, 0, 0, 1, 0),
                               "VT" = c(-1, 0, 0, 0, 1))
contrasts(d5$selfunsuregodreal) <- cbind("Y" = c(-1, 1))
r5 <- glm(godviavisions_num ~ selfunsuregodreal + country,
                  family = "binomial", data = d5)
summary(r5)

Call:
glm(formula = godviavisions_num ~ selfunsuregodreal + country, 
    family = "binomial", data = d5)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-1.3530  -0.9346  -0.6884   1.0629   1.8214  

Coefficients:
                   Estimate Std. Error z value Pr(>|z|)    
(Intercept)        -0.61222    0.12652  -4.839 1.30e-06 ***
selfunsuregodrealY  0.06415    0.13016   0.493   0.6221    
countryGH           0.95182    0.21279   4.473 7.71e-06 ***
countryTH           0.33395    0.26614   1.255   0.2096    
countryCH          -0.58890    0.27649  -2.130   0.0332 *  
countryVT           0.07429    0.25358   0.293   0.7696    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 422.46  on 318  degrees of freedom
Residual deviance: 391.05  on 313  degrees of freedom
AIC: 403.05

Number of Fisher Scoring iterations: 4

Spiritual experiences indexed by godviabodyexperiences

Some people have particular experiences in your body that they associate with God* or spirit. Does that happen for you? [examples: warm hands, goosebumps, fire in the belly]

d %>%
  filter(!is.na(selfunsuregodreal), !is.na(godviabodyexperiences)) %>% #,
         # selfunsuregodreal != "Other", godviabodyexperiences != "Other") %>%
  ggplot(aes(x = selfunsuregodreal, y = godviabodyexperiences, color = researcher)) +
  facet_grid(urban_rural ~ charismatic_local ~ country) +
  geom_point(alpha = 0.3, position = position_jitter(0.2, 0.2)) +
  scale_color_manual(values = custom_pal) +
  labs(title = paste("selfunsuregodreal", "godviabodyexperiences", sep = " x "),
       # subtitle = "Excluding people who did not have a clear answer",
       x = "selfunsuregodreal",
       y = "godviabodyexperiences",
       color = "Researcher") +
  theme_bw() +
  theme(legend.position = "top",
        axis.text.x = element_text(angle = 90, hjust = 1, vjust = 0.5)) +
  guides(color = guide_legend(ncol = 6, byrow = TRUE, 
                              override.aes = list(alpha = 1)))

d %>%
  filter(!is.na(selfunsuregodreal), !is.na(godviabodyexperiences),
         selfunsuregodreal != "Other", godviabodyexperiences != "Other") %>%
  ggplot(aes(x = selfunsuregodreal, alpha = godviabodyexperiences, fill = researcher)) +
  facet_grid(urban_rural ~ charismatic_local ~ country) +
  geom_bar(position = "fill") +
  geom_text(data = selfunsuregodreal_count_by_quad,
            aes(x = selfunsuregodreal, y = 1, alpha = NULL, fill = NULL,
                label = paste0("(n=", n, ")")),
            size = 2, nudge_y = 0.05) +
  # scale_fill_brewer(guide = NULL, palette = "Dark2") +
  scale_fill_manual(guide = NULL, values = custom_pal) +
  scale_alpha_discrete(range = c(0.5, 1)) +
  scale_y_continuous(breaks = seq(0, 1, 0.25)) +
  labs(title = paste("selfunsuregodreal", "godviabodyexperiences", sep = " x "),
       subtitle = "Excluding people who did not have a clear answer",
       x = "selfunsuregodreal",
       y = "Proportion",
       alpha = "godviabodyexperiences",
       fill = "Researcher") +
  theme_bw() +
  theme(legend.position = "top",
        axis.text.x = element_text(angle = 90, hjust = 1, vjust = 0.5)) +
  guides(alpha = guide_legend(),
         fill = "none")
Ignoring unknown aesthetics: fill

d %>%
  filter(!is.na(selfunsuregodreal), !is.na(godviabodyexperiences),
         selfunsuregodreal != "Other", godviabodyexperiences != "Other") %>%
  ggplot(aes(x = selfunsuregodreal, alpha = godviabodyexperiences, fill = country)) +
  facet_grid(. ~ country) +
  geom_bar(position = "fill") +
  geom_text(data = selfunsuregodreal_count,
            aes(x = selfunsuregodreal, y = 1, alpha = NULL, fill = NULL,
                label = paste0("(n=", n, ")")),
            size = 2, nudge_y = 0.05) +
  scale_fill_brewer(guide = NULL, palette = "Dark2") +
  # scale_fill_manual(guide = NULL, values = custom_pal) +
  scale_alpha_discrete(range = c(0.5, 1)) +
  scale_y_continuous(breaks = seq(0, 1, 0.25)) +
  labs(title = paste("selfunsuregodreal", "godviabodyexperiences", sep = " x "),
       subtitle = "Excluding people who did not have a clear answer",
       x = "selfunsuregodreal",
       y = "Proportion",
       alpha = "godviabodyexperiences",
       fill = "Researcher") +
  theme_bw() +
  theme(legend.position = "top",
        axis.text.x = element_text(angle = 90, hjust = 1, vjust = 0.5)) +
  guides(alpha = guide_legend(),
         fill = "none")
Ignoring unknown aesthetics: fill

d6 <- d %>%
  filter(!is.na(selfunsuregodreal), !is.na(godviabodyexperiences),
         selfunsuregodreal != "Other", godviabodyexperiences != "Other",
         selfunsuregodreal != "Maybe") %>%
  mutate(selfunsuregodreal = factor(selfunsuregodreal,
                                    levels = c("No", "Yes")),
         selfunsuregodreal_num = as.numeric(selfunsuregodreal) - 1,
         godviabodyexperiences = factor(godviabodyexperiences,
                               levels = c("No", "Yes")),
         godviabodyexperiences_num = as.numeric(godviabodyexperiences) - 1) %>%
  select(country, researcher, urban_rural, charismatic_local, subject_name,
         starts_with("selfunsuregodreal"), starts_with("godviabodyexperiences"))
contrasts(d6$country) <- cbind("GH" = c(-1, 1, 0, 0, 0),
                               "TH" = c(-1, 0, 1, 0, 0),
                               "CH" = c(-1, 0, 0, 1, 0),
                               "VT" = c(-1, 0, 0, 0, 1))
contrasts(d6$selfunsuregodreal) <- cbind("Y" = c(-1, 1))
r6 <- glm(godviabodyexperiences_num ~ selfunsuregodreal + country,
                  family = "binomial", data = d6)
summary(r6)

Call:
glm(formula = godviabodyexperiences_num ~ selfunsuregodreal + 
    country, family = "binomial", data = d6)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-1.8606  -1.2321   0.6274   0.9309   1.2922  

Coefficients:
                   Estimate Std. Error z value Pr(>|z|)    
(Intercept)          0.7056     0.1277   5.523 3.33e-08 ***
selfunsuregodrealY   0.2421     0.1317   1.839   0.0659 .  
countryGH            0.5778     0.2363   2.446   0.0145 *  
countryTH            0.5884     0.3089   1.905   0.0568 .  
countryCH           -0.3357     0.2470  -1.359   0.1742    
countryVT           -0.1013     0.2519  -0.402   0.6876    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 411.83  on 319  degrees of freedom
Residual deviance: 390.07  on 314  degrees of freedom
AIC: 402.07

Number of Fisher Scoring iterations: 4

“Doubt” indxed by morequesmoreanswr

Do you think that the more spiritually mature you become, you will discover more questions or more answers?

morequesmoreanswr_count <- d %>%
  filter(!is.na(morequesmoreanswr), !is.na(godvoxaloud),
         morequesmoreanswr != "Other", godvoxaloud != "Other") %>%
  count(country, morequesmoreanswr) %>%
  data.frame()
morequesmoreanswr_count_by_quad <- d %>%
  filter(!is.na(morequesmoreanswr), !is.na(godvoxaloud),
         morequesmoreanswr != "Other", godvoxaloud != "Other") %>%
  count(country, urban_rural, charismatic_local, morequesmoreanswr) %>%
  data.frame()

Spiritual experiences indexed by godvoxaloud

Some people say that they have heard God* speak out loud to them. Has this ever happened to you?

d %>%
  filter(!is.na(morequesmoreanswr), !is.na(godvoxaloud)) %>% #,
         # morequesmoreanswr != "Other", godvoxaloud != "Other") %>%
  ggplot(aes(x = morequesmoreanswr, y = godvoxaloud, color = researcher)) +
  facet_grid(urban_rural ~ charismatic_local ~ country) +
  geom_point(alpha = 0.3, position = position_jitter(0.2, 0.2)) +
  scale_color_manual(values = custom_pal) +
  labs(title = paste("morequesmoreanswr", "godvoxaloud", sep = " x "),
       # subtitle = "Excluding people who did not have a clear answer",
       x = "morequesmoreanswr",
       y = "godvoxaloud",
       color = "Researcher") +
  theme_bw() +
  theme(legend.position = "top",
        axis.text.x = element_text(angle = 90, hjust = 1, vjust = 0.5)) +
  guides(color = guide_legend(ncol = 6, byrow = TRUE, 
                              override.aes = list(alpha = 1)))

d %>%
  filter(!is.na(morequesmoreanswr), !is.na(godvoxaloud),
         morequesmoreanswr != "Other", godvoxaloud != "Other") %>%
  ggplot(aes(x = morequesmoreanswr, alpha = godvoxaloud, fill = researcher)) +
  facet_grid(urban_rural ~ charismatic_local ~ country) +
  geom_bar(position = "fill") +
  geom_text(data = morequesmoreanswr_count_by_quad,
            aes(x = morequesmoreanswr, y = 1, alpha = NULL, fill = NULL,
                label = paste0("(n=", n, ")")),
            size = 2, nudge_y = 0.05) +
  # scale_fill_brewer(guide = NULL, palette = "Dark2") +
  scale_fill_manual(guide = NULL, values = custom_pal) +
  scale_alpha_discrete(range = c(0.5, 1)) +
  scale_y_continuous(breaks = seq(0, 1, 0.25)) +
  labs(title = paste("morequesmoreanswr", "godvoxaloud", sep = " x "),
       subtitle = "Excluding people who did not have a clear answer",
       x = "morequesmoreanswr",
       y = "Proportion",
       alpha = "godvoxaloud",
       fill = "Researcher") +
  theme_bw() +
  theme(legend.position = "top",
        axis.text.x = element_text(angle = 90, hjust = 1, vjust = 0.5)) +
  guides(alpha = guide_legend(),
         fill = "none")
Ignoring unknown aesthetics: fill

d %>%
  filter(!is.na(morequesmoreanswr), !is.na(godvoxaloud),
         morequesmoreanswr != "Other", godvoxaloud != "Other") %>%
  ggplot(aes(x = morequesmoreanswr, alpha = godvoxaloud, fill = country)) +
  facet_grid(. ~ country) +
  geom_bar(position = "fill") +
  geom_text(data = morequesmoreanswr_count,
            aes(x = morequesmoreanswr, y = 1, alpha = NULL, fill = NULL,
                label = paste0("(n=", n, ")")),
            size = 2, nudge_y = 0.05) +
  scale_fill_brewer(guide = NULL, palette = "Dark2") +
  # scale_fill_manual(guide = NULL, values = custom_pal) +
  scale_alpha_discrete(range = c(0.5, 1)) +
  scale_y_continuous(breaks = seq(0, 1, 0.25)) +
  labs(title = paste("morequesmoreanswr", "godvoxaloud", sep = " x "),
       subtitle = "Excluding people who did not have a clear answer",
       x = "morequesmoreanswr",
       y = "Proportion",
       alpha = "godvoxaloud",
       fill = "Researcher") +
  theme_bw() +
  theme(legend.position = "top",
        axis.text.x = element_text(angle = 90, hjust = 1, vjust = 0.5)) +
  guides(alpha = guide_legend(),
         fill = "none")
Ignoring unknown aesthetics: fill

d7 <- d %>%
  filter(!is.na(morequesmoreanswr), !is.na(godvoxaloud),
         morequesmoreanswr != "Other", godvoxaloud != "Other") %>%
  mutate(morequesmoreanswr = factor(morequesmoreanswr),
         morequesmoreanswr_num = as.numeric(morequesmoreanswr) - 1,
         godvoxaloud = factor(godvoxaloud,
                               levels = c("No", "Yes")),
         godvoxaloud_num = as.numeric(godvoxaloud) - 1) %>%
  select(country, researcher, urban_rural, charismatic_local, subject_name,
         starts_with("morequesmoreanswr"), starts_with("godvoxaloud"))
contrasts(d7$country) <- cbind("GH" = c(-1, 1, 0, 0, 0),
                               "TH" = c(-1, 0, 1, 0, 0),
                               "CH" = c(-1, 0, 0, 1, 0),
                               "VT" = c(-1, 0, 0, 0, 1))
contrasts(d7$morequesmoreanswr) <- cbind("Q" = c(1, -1))
r7 <- glm(godvoxaloud_num ~ morequesmoreanswr + country,
                  family = "binomial", data = d7)
summary(r7)

Call:
glm(formula = godvoxaloud_num ~ morequesmoreanswr + country, 
    family = "binomial", data = d7)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-1.4044  -0.9984  -0.4288   0.9900   2.2055  

Coefficients:
                   Estimate Std. Error z value Pr(>|z|)    
(Intercept)        -0.65574    0.16797  -3.904 9.46e-05 ***
morequesmoreanswrQ -0.03057    0.15819  -0.193    0.847    
countryGH           1.14447    0.23706   4.828 1.38e-06 ***
countryTH           0.18839    0.31250   0.603    0.547    
countryCH           0.28946    0.33757   0.857    0.391    
countryVT           0.03154    0.32558   0.097    0.923    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 325.90  on 241  degrees of freedom
Residual deviance: 280.75  on 236  degrees of freedom
AIC: 292.75

Number of Fisher Scoring iterations: 4

Spiritual experiences indexed by godviavisions

_Some people say that they have had a vision from God*—they have a picture, but it is like they see it with their eyes. Has anything like that happened to you?_

d %>%
  filter(!is.na(morequesmoreanswr), !is.na(godviavisions)) %>% #,
         # morequesmoreanswr != "Other", godviavisions != "Other") %>%
  ggplot(aes(x = morequesmoreanswr, y = godviavisions, color = researcher)) +
  facet_grid(urban_rural ~ charismatic_local ~ country) +
  geom_point(alpha = 0.3, position = position_jitter(0.2, 0.2)) +
  scale_color_manual(values = custom_pal) +
  labs(title = paste("morequesmoreanswr", "godviavisions", sep = " x "),
       # subtitle = "Excluding people who did not have a clear answer",
       x = "morequesmoreanswr",
       y = "godviavisions",
       color = "Researcher") +
  theme_bw() +
  theme(legend.position = "top",
        axis.text.x = element_text(angle = 90, hjust = 1, vjust = 0.5)) +
  guides(color = guide_legend(ncol = 6, byrow = TRUE, 
                              override.aes = list(alpha = 1)))

d %>%
  filter(!is.na(morequesmoreanswr), !is.na(godviavisions),
         morequesmoreanswr != "Other", godviavisions != "Other") %>%
  ggplot(aes(x = morequesmoreanswr, alpha = godviavisions, fill = researcher)) +
  facet_grid(urban_rural ~ charismatic_local ~ country) +
  geom_bar(position = "fill") +
  geom_text(data = morequesmoreanswr_count_by_quad,
            aes(x = morequesmoreanswr, y = 1, alpha = NULL, fill = NULL,
                label = paste0("(n=", n, ")")),
            size = 2, nudge_y = 0.05) +
  # scale_fill_brewer(guide = NULL, palette = "Dark2") +
  scale_fill_manual(guide = NULL, values = custom_pal) +
  scale_alpha_discrete(range = c(0.5, 1)) +
  scale_y_continuous(breaks = seq(0, 1, 0.25)) +
  labs(title = paste("morequesmoreanswr", "godviavisions", sep = " x "),
       subtitle = "Excluding people who did not have a clear answer",
       x = "morequesmoreanswr",
       y = "Proportion",
       alpha = "godviavisions",
       fill = "Researcher") +
  theme_bw() +
  theme(legend.position = "top",
        axis.text.x = element_text(angle = 90, hjust = 1, vjust = 0.5)) +
  guides(alpha = guide_legend(),
         fill = "none")
Ignoring unknown aesthetics: fill

d %>%
  filter(!is.na(morequesmoreanswr), !is.na(godviavisions),
         morequesmoreanswr != "Other", godviavisions != "Other") %>%
  ggplot(aes(x = morequesmoreanswr, alpha = godviavisions, fill = country)) +
  facet_grid(. ~ country) +
  geom_bar(position = "fill") +
  geom_text(data = morequesmoreanswr_count,
            aes(x = morequesmoreanswr, y = 1, alpha = NULL, fill = NULL,
                label = paste0("(n=", n, ")")),
            size = 2, nudge_y = 0.05) +
  scale_fill_brewer(guide = NULL, palette = "Dark2") +
  # scale_fill_manual(guide = NULL, values = custom_pal) +
  scale_alpha_discrete(range = c(0.5, 1)) +
  scale_y_continuous(breaks = seq(0, 1, 0.25)) +
  labs(title = paste("morequesmoreanswr", "godviavisions", sep = " x "),
       subtitle = "Excluding people who did not have a clear answer",
       x = "morequesmoreanswr",
       y = "Proportion",
       alpha = "godviavisions",
       fill = "Researcher") +
  theme_bw() +
  theme(legend.position = "top",
        axis.text.x = element_text(angle = 90, hjust = 1, vjust = 0.5)) +
  guides(alpha = guide_legend(),
         fill = "none")
Ignoring unknown aesthetics: fill

d8 <- d %>%
  filter(!is.na(morequesmoreanswr), !is.na(godviavisions),
         morequesmoreanswr != "Other", godviavisions != "Other") %>%
  mutate(morequesmoreanswr = factor(morequesmoreanswr),
         morequesmoreanswr_num = as.numeric(morequesmoreanswr) - 1,
         godviavisions = factor(godviavisions,
                               levels = c("No", "Yes")),
         godviavisions_num = as.numeric(godviavisions) - 1) %>%
  select(country, researcher, urban_rural, charismatic_local, subject_name,
         starts_with("morequesmoreanswr"), starts_with("godviavisions"))
contrasts(d8$country) <- cbind("GH" = c(-1, 1, 0, 0, 0),
                               "TH" = c(-1, 0, 1, 0, 0),
                               "CH" = c(-1, 0, 0, 1, 0),
                               "VT" = c(-1, 0, 0, 0, 1))
contrasts(d8$morequesmoreanswr) <- cbind("Q" = c(1, -1))
r8 <- glm(godviavisions_num ~ morequesmoreanswr + country,
                  family = "binomial", data = d8)
summary(r8)

Call:
glm(formula = godviavisions_num ~ morequesmoreanswr + country, 
    family = "binomial", data = d8)

Deviance Residuals: 
   Min      1Q  Median      3Q     Max  
-1.388  -1.039  -0.616   1.127   2.026  

Coefficients:
                   Estimate Std. Error z value Pr(>|z|)    
(Intercept)         -0.6647     0.1687  -3.939 8.18e-05 ***
morequesmoreanswrQ   0.1811     0.1525   1.188   0.2349    
countryGH            0.9661     0.2353   4.106 4.03e-05 ***
countryTH            0.5124     0.3171   1.616   0.1061    
countryCH           -1.0697     0.4511  -2.372   0.0177 *  
countryVT            0.3111     0.3162   0.984   0.3251    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 325.22  on 242  degrees of freedom
Residual deviance: 295.17  on 237  degrees of freedom
AIC: 307.17

Number of Fisher Scoring iterations: 4

Spiritual experiences indexed by godviabodyexperiences

Some people have particular experiences in your body that they associate with God* or spirit. Does that happen for you? [examples: warm hands, goosebumps, fire in the belly]

d %>%
  filter(!is.na(morequesmoreanswr), !is.na(godviabodyexperiences)) %>% #,
         # morequesmoreanswr != "Other", godviabodyexperiences != "Other") %>%
  ggplot(aes(x = morequesmoreanswr, y = godviabodyexperiences, color = researcher)) +
  facet_grid(urban_rural ~ charismatic_local ~ country) +
  geom_point(alpha = 0.3, position = position_jitter(0.2, 0.2)) +
  scale_color_manual(values = custom_pal) +
  labs(title = paste("morequesmoreanswr", "godviabodyexperiences", sep = " x "),
       # subtitle = "Excluding people who did not have a clear answer",
       x = "morequesmoreanswr",
       y = "godviabodyexperiences",
       color = "Researcher") +
  theme_bw() +
  theme(legend.position = "top",
        axis.text.x = element_text(angle = 90, hjust = 1, vjust = 0.5)) +
  guides(color = guide_legend(ncol = 6, byrow = TRUE, 
                              override.aes = list(alpha = 1)))

d %>%
  filter(!is.na(morequesmoreanswr), !is.na(godviabodyexperiences),
         morequesmoreanswr != "Other", godviabodyexperiences != "Other") %>%
  ggplot(aes(x = morequesmoreanswr, alpha = godviabodyexperiences, fill = researcher)) +
  facet_grid(urban_rural ~ charismatic_local ~ country) +
  geom_bar(position = "fill") +
  geom_text(data = morequesmoreanswr_count_by_quad,
            aes(x = morequesmoreanswr, y = 1, alpha = NULL, fill = NULL,
                label = paste0("(n=", n, ")")),
            size = 2, nudge_y = 0.05) +
  # scale_fill_brewer(guide = NULL, palette = "Dark2") +
  scale_fill_manual(guide = NULL, values = custom_pal) +
  scale_alpha_discrete(range = c(0.5, 1)) +
  scale_y_continuous(breaks = seq(0, 1, 0.25)) +
  labs(title = paste("morequesmoreanswr", "godviabodyexperiences", sep = " x "),
       subtitle = "Excluding people who did not have a clear answer",
       x = "morequesmoreanswr",
       y = "Proportion",
       alpha = "godviabodyexperiences",
       fill = "Researcher") +
  theme_bw() +
  theme(legend.position = "top",
        axis.text.x = element_text(angle = 90, hjust = 1, vjust = 0.5)) +
  guides(alpha = guide_legend(),
         fill = "none")
Ignoring unknown aesthetics: fill

d %>%
  filter(!is.na(morequesmoreanswr), !is.na(godviabodyexperiences),
         morequesmoreanswr != "Other", godviabodyexperiences != "Other") %>%
  ggplot(aes(x = morequesmoreanswr, alpha = godviabodyexperiences, fill = country)) +
  facet_grid(. ~ country) +
  geom_bar(position = "fill") +
  geom_text(data = morequesmoreanswr_count,
            aes(x = morequesmoreanswr, y = 1, alpha = NULL, fill = NULL,
                label = paste0("(n=", n, ")")),
            size = 2, nudge_y = 0.05) +
  scale_fill_brewer(guide = NULL, palette = "Dark2") +
  # scale_fill_manual(guide = NULL, values = custom_pal) +
  scale_alpha_discrete(range = c(0.5, 1)) +
  scale_y_continuous(breaks = seq(0, 1, 0.25)) +
  labs(title = paste("morequesmoreanswr", "godviabodyexperiences", sep = " x "),
       subtitle = "Excluding people who did not have a clear answer",
       x = "morequesmoreanswr",
       y = "Proportion",
       alpha = "godviabodyexperiences",
       fill = "Researcher") +
  theme_bw() +
  theme(legend.position = "top",
        axis.text.x = element_text(angle = 90, hjust = 1, vjust = 0.5)) +
  guides(alpha = guide_legend(),
         fill = "none")
Ignoring unknown aesthetics: fill

d9 <- d %>%
  filter(!is.na(morequesmoreanswr), !is.na(godviabodyexperiences),
         morequesmoreanswr != "Other", godviabodyexperiences != "Other") %>%
  mutate(morequesmoreanswr = factor(morequesmoreanswr),
         morequesmoreanswr_num = as.numeric(morequesmoreanswr) - 1,
         godviabodyexperiences = factor(godviabodyexperiences,
                               levels = c("No", "Yes")),
         godviabodyexperiences_num = as.numeric(godviabodyexperiences) - 1) %>%
  select(country, researcher, urban_rural, charismatic_local, subject_name,
         starts_with("morequesmoreanswr"), starts_with("godviabodyexperiences"))
contrasts(d9$country) <- cbind("GH" = c(-1, 1, 0, 0, 0),
                               "TH" = c(-1, 0, 1, 0, 0),
                               "CH" = c(-1, 0, 0, 1, 0),
                               "VT" = c(-1, 0, 0, 0, 1))
contrasts(d9$morequesmoreanswr) <- cbind("Q" = c(1, -1))
r9 <- glm(godviabodyexperiences_num ~ morequesmoreanswr + country,
                  family = "binomial", data = d9)
summary(r9)

Call:
glm(formula = godviabodyexperiences_num ~ morequesmoreanswr + 
    country, family = "binomial", data = d9)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-1.9152  -1.2161   0.7310   0.9641   1.1674  

Coefficients:
                   Estimate Std. Error z value Pr(>|z|)    
(Intercept)         0.71079    0.15975   4.449 8.62e-06 ***
morequesmoreanswrQ  0.03348    0.15584   0.215   0.8299    
countryGH           0.43886    0.24850   1.766   0.0774 .  
countryTH           0.91566    0.38084   2.404   0.0162 *  
countryCH          -0.54853    0.33456  -1.640   0.1011    
countryVT          -0.15232    0.30627  -0.497   0.6190    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 310.96  on 244  degrees of freedom
Residual deviance: 294.81  on 239  degrees of freedom
AIC: 306.81

Number of Fisher Scoring iterations: 4

Absorption & spiritual experiences

Aggregate spiritual experiences score

d_spirit %>%
  filter(!is.na(abs_score), !is.na(spex_score)) %>%
  distinct(country, researcher, urban_rural, charismatic_local,
           subject_name, abs_score, spex_score) %>%
  ggplot(aes(x = abs_score, y = spex_score, color = researcher)) +
  facet_grid(urban_rural ~ charismatic_local ~ country) +
  geom_point(alpha = 0.3, position = position_jitter(0.2, 0)) +
  scale_color_manual(values = custom_pal) +
  labs(title = paste("abs_score", "spex_score", sep = " x "),
       # subtitle = "Excluding people who did not have a clear answer",
       x = "abs_score",
       y = "spex_score",
       color = "Researcher") +
  theme_bw() +
  theme(legend.position = "top",
        axis.text.x = element_text(angle = 90, hjust = 1, vjust = 0.5)) +
  guides(color = guide_legend(ncol = 6, byrow = TRUE, 
                              override.aes = list(alpha = 1)))

d_spirit %>%
  filter(!is.na(abs_score), !is.na(spex_score)) %>%
  distinct(country, researcher, urban_rural, charismatic_local,
           subject_name, abs_score, spex_score) %>%
  ggplot(aes(x = abs_score, y = spex_score, 
             color = country, fill = country, group = country)) +
  facet_grid(. ~ country) +
  geom_point(alpha = 0.3, position = position_jitter(0.2, 0)) +
  geom_smooth(aes(x = as.numeric(abs_score)), method = "lm") +
  # geom_smooth(aes(x = as.numeric(abs_score)), method = "loess") +
  # scale_color_manual(values = custom_pal) +
  # scale_fill_manual(values = custom_pal) +
  scale_color_brewer(palette = "Dark2") +
  scale_fill_brewer(palette = "Dark2") +
  labs(title = paste("abs_score", "spex_score", sep = " x "),
       # subtitle = "Excluding people who did not have a clear answer",
       x = "abs_score",
       y = "spex_score",
       color = "Researcher", fill = "Researcher") +
  theme_bw() +
  theme(legend.position = "top",
        axis.text.x = element_text(angle = 90, hjust = 1, vjust = 0.5)) +
  guides(color = guide_legend(ncol = 6, byrow = TRUE, 
                              override.aes = list(alpha = 1)),
         fill = guide_legend(ncol = 6, byrow = TRUE))

d_agg2 <- d_spirit %>%
  filter(!is.na(abs_score), !is.na(spex_score),
         abs_score != "Other", spex_score != "Other") %>%
  # distinct(country, researcher, urban_rural, charismatic_local,
  #          subject_name, abs_score, spex_score) %>%
  mutate(abs_score_num = as.numeric(abs_score) - 1) # %>%
  # select(country, researcher, urban_rural, charismatic_local, subject_name,
  #        starts_with("abs_score"), starts_with("spex_score"))
contrasts(d_agg2$country) <- cbind("GH" = c(-1, 1, 0, 0, 0),
                               "TH" = c(-1, 0, 1, 0, 0),
                               "CH" = c(-1, 0, 0, 1, 0),
                               "VT" = c(-1, 0, 0, 0, 1))
r_agg3 <- lmer(response ~ scale(abs_score, scale = F) + country 
               + (1 | subject_name) + (1 | question), 
               data = d_agg2)
summary(r_agg3)
Linear mixed model fit by REML ['lmerMod']
Formula: 
response ~ scale(abs_score, scale = F) + country + (1 | subject_name) +  
    (1 | question)
   Data: d_agg2

REML criterion at convergence: 8842.1

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-2.6193 -0.7848 -0.1847  0.8886  2.5512 

Random effects:
 Groups       Name        Variance Std.Dev.
 subject_name (Intercept) 0.02356  0.1535  
 question     (Intercept) 0.03631  0.1905  
 Residual                 0.17833  0.4223  
Number of obs: 7418, groups:  subject_name, 320; question, 24

Fixed effects:
                             Estimate Std. Error t value
(Intercept)                  0.446950   0.040202  11.118
scale(abs_score, scale = F)  0.005888   0.001420   4.146
countryGH                    0.028049   0.017994   1.559
countryTH                   -0.034780   0.021471  -1.620
countryCH                   -0.056734   0.021195  -2.677
countryVT                    0.143577   0.023114   6.212

Correlation of Fixed Effects:
            (Intr) s(_s=F cntrGH cntrTH cntrCH
scl(b_,s=F) -0.006                            
countryGH   -0.041 -0.051                     
countryTH    0.019 -0.012 -0.230              
countryCH    0.006  0.193 -0.219 -0.279       
countryVT    0.034 -0.242 -0.236 -0.298 -0.332
r_agg4 <- lmer(response ~ scale(abs_score, scale = F) * country 
               + (1 | subject_name) + (1 | question), 
               data = d_agg2)
summary(r_agg4)
Linear mixed model fit by REML ['lmerMod']
Formula: 
response ~ scale(abs_score, scale = F) * country + (1 | subject_name) +  
    (1 | question)
   Data: d_agg2

REML criterion at convergence: 8879.6

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-2.6200 -0.7842 -0.1839  0.8860  2.5509 

Random effects:
 Groups       Name        Variance Std.Dev.
 subject_name (Intercept) 0.02371  0.1540  
 question     (Intercept) 0.03630  0.1905  
 Residual                 0.17833  0.4223  
Number of obs: 7418, groups:  subject_name, 320; question, 24

Fixed effects:
                                        Estimate Std. Error t value
(Intercept)                            0.4455970  0.0403955  11.031
scale(abs_score, scale = F)            0.0064983  0.0015318   4.242
countryGH                              0.0301795  0.0185149   1.630
countryTH                             -0.0355340  0.0219127  -1.622
countryCH                             -0.0592259  0.0222275  -2.665
countryVT                              0.1443285  0.0263563   5.476
scale(abs_score, scale = F):countryGH -0.0015553  0.0024737  -0.629
scale(abs_score, scale = F):countryTH  0.0052519  0.0035136   1.495
scale(abs_score, scale = F):countryCH -0.0020379  0.0028943  -0.704
scale(abs_score, scale = F):countryVT -0.0004637  0.0035465  -0.131

Correlation of Fixed Effects:
            (Intr) sc(_,s=F) cntrGH cntrTH cntrCH cntrVT s(_,s=F):G
scl(b_,s=F) -0.026                                                 
countryGH   -0.060  0.020                                          
countryTH    0.001  0.012    -0.185                                
countryCH    0.006  0.206    -0.194 -0.258                         
countryVT    0.068 -0.308    -0.301 -0.333 -0.336                  
s(_,s=F):GH  0.006 -0.287    -0.103  0.012 -0.109  0.207           
s(_,s=F):TH  0.003  0.183     0.010 -0.067 -0.074  0.147 -0.258    
s(_,s=F):CH  0.060 -0.076    -0.111 -0.092  0.228  0.092 -0.129    
s(_,s=F):VT -0.087  0.196     0.205  0.176  0.089 -0.468 -0.265    
            s(_,s=F):T s(_,s=F):C
scl(b_,s=F)                      
countryGH                        
countryTH                        
countryCH                        
countryVT                        
s(_,s=F):GH                      
s(_,s=F):TH                      
s(_,s=F):CH -0.295               
s(_,s=F):VT -0.353     -0.299    
anova(r_agg3, r_agg4)
refitting model(s) with ML (instead of REML)
Data: d_agg2
Models:
r_agg3: response ~ scale(abs_score, scale = F) + country + (1 | subject_name) + 
r_agg3:     (1 | question)
r_agg4: response ~ scale(abs_score, scale = F) * country + (1 | subject_name) + 
r_agg4:     (1 | question)
       Df    AIC    BIC  logLik deviance  Chisq Chi Df Pr(>Chisq)
r_agg3  9 8819.6 8881.8 -4400.8   8801.6                         
r_agg4 13 8825.1 8914.9 -4399.5   8799.1 2.5102      4     0.6428
d_r_agg3_predicted <- d_agg2 %>%
  mutate(response_pred = predict(r_agg3, d_agg2)) %>%
  group_by(subject_name) %>%
  mutate(spex_score_pred = sum(response_pred, na.rm = T)) %>%
  ungroup() %>%
  group_by(country, abs_score) %>%
  do(data.frame(rbind(smean.cl.boot(.$spex_score_pred))))
d_spirit %>%
  filter(!is.na(abs_score), !is.na(spex_score)) %>%
  distinct(country, researcher, urban_rural, charismatic_local,
           subject_name, abs_score, spex_score) %>%
  ggplot(aes(x = abs_score, y = spex_score, 
             color = country, fill = country, group = country)) +
  facet_grid(. ~ country) +
  geom_point(alpha = 0.3, position = position_jitter(0.2, 0)) +
  geom_line(data = d_r_agg3_predicted, aes(y = Mean)) +
  geom_ribbon(data = d_r_agg3_predicted, 
              aes(ymin = Lower, ymax = Upper, y = NULL), 
              alpha = 0.5, size = 0) +
  # scale_color_manual(values = custom_pal) +
  # scale_fill_manual(values = custom_pal) +
  scale_color_brewer(palette = "Dark2") +
  scale_fill_brewer(palette = "Dark2") +
  labs(title = paste("abs_score", "spex_score", sep = " x "),
       subtitle = "Lines are predictions from a mixed effects linear regression:\nlmer(response ~ abs_score + country + (1 | subject_name) + (1 | question)",
       x = "abs_score",
       y = "spex_score",
       color = "Site", fill = "Site") +
  theme_bw() +
  theme(legend.position = "top",
        axis.text.x = element_text(angle = 90, hjust = 1, vjust = 0.5)) +
  guides(color = "none",
         fill = "none")
Ignoring unknown aesthetics: y

Looking just at ‘apples’ (urban charismatics)

d_spirit %>%
  filter(!is.na(abs_score), !is.na(spex_score),
         quad == "urban charismatic") %>%
  distinct(country, researcher, charismatic_local, urban_rural, 
           subject_name, abs_score, spex_score) %>%
  ggplot(aes(x = abs_score, y = spex_score, 
             color = country, fill = country, group = country)) +
  facet_grid(charismatic_local ~ urban_rural ~ country) +
  geom_point(alpha = 0.3, position = position_jitter(0.2, 0)) +
  geom_smooth(method = "lm") +
  # scale_color_manual(values = custom_pal) +
  # scale_fill_manual(values = custom_pal) +
  scale_color_brewer(palette = "Dark2") +
  scale_fill_brewer(palette = "Dark2") +
  labs(title = paste("abs_score", "spex_score", sep = " x "),
       # subtitle = "Lines are predictions from a mixed effects linear regression:\nlmer(response ~ abs_score + country + (1 | subject_name) + (1 | question)",
       x = "abs_score",
       y = "spex_score",
       color = "Site", fill = "Site") +
  theme_bw() +
  theme(legend.position = "top",
        axis.text.x = element_text(angle = 90, hjust = 1, vjust = 0.5)) +
  guides(color = "none",
         fill = "none")

Looking at all charismatics

d_spirit %>%
  filter(!is.na(abs_score), !is.na(spex_score),
         charismatic_local == "charismatic") %>%
  distinct(country, researcher, charismatic_local, urban_rural, 
           subject_name, abs_score, spex_score) %>%
  ggplot(aes(x = abs_score, y = spex_score, 
             color = country, fill = country, group = country)) +
  facet_grid(charismatic_local ~ country) +
  geom_point(alpha = 0.3, position = position_jitter(0.2, 0)) +
  geom_smooth(method = "lm") +
  # scale_color_manual(values = custom_pal) +
  # scale_fill_manual(values = custom_pal) +
  scale_color_brewer(palette = "Dark2") +
  scale_fill_brewer(palette = "Dark2") +
  labs(title = paste("abs_score", "spex_score", sep = " x "),
       # subtitle = "Lines are predictions from a mixed effects linear regression:\nlmer(response ~ abs_score + country + (1 | subject_name) + (1 | question)",
       x = "abs_score",
       y = "spex_score",
       color = "Site", fill = "Site") +
  theme_bw() +
  theme(legend.position = "top",
        axis.text.x = element_text(angle = 90, hjust = 1, vjust = 0.5)) +
  guides(color = "none",
         fill = "none")

To do

Here are other things on our to-do list:

LS0tCnRpdGxlOiAnUVRTIGRhdGE6IFNwaXJpdHVhbCBjdXJpb3NpdHkgcmVsYXRpb25zaGlwcycKc3VidGl0bGU6ICdMYXN0IHVwZGF0ZWQgMjAxOC0wNC0xMicKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6IAogICAgdG9jOiB0cnVlCiAgaHRtbF9kb2N1bWVudDoKICAgIGRmX3ByaW50OiBwYWdlZAogIHBkZl9kb2N1bWVudDogZGVmYXVsdAotLS0KCmBgYHtyLCBpbmNsdWRlID0gRn0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFKQpgYGAKCmBgYHtyLCBpbmNsdWRlID0gRn0KIyBsb2FkIHBhY2thZ2VzCmxpYnJhcnkocmVhZHhsKQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShybXMpCmxpYnJhcnkoa25pdHIpCmxpYnJhcnkoa2FibGVFeHRyYSkKbGlicmFyeShvcmRpbmFsKQpsaWJyYXJ5KGxtZTQpCgojIHJ1biBzZXR1cCBzY3JpcHQKc291cmNlKCIvVXNlcnMva3dlaXNtYW4vRG9jdW1lbnRzL1Jlc2VhcmNoIChTdGFuZm9yZCkvUHJvamVjdHMvVGVtcGxldG9uIEdyYW50L0RBVEEgV1JBTkdMSU5HL3RlbXBsZXRvbl9xdHMvc2NyaXB0cy9zZXR1cF9xdHNfa3cuUiIpCgojIHJ1biBkYXRhIHdyYW5nbGluZyBzY3JpcHQKc291cmNlKCIvVXNlcnMva3dlaXNtYW4vRG9jdW1lbnRzL1Jlc2VhcmNoIChTdGFuZm9yZCkvUHJvamVjdHMvVGVtcGxldG9uIEdyYW50L0RBVEEgV1JBTkdMSU5HL3RlbXBsZXRvbl9xdHMvc2NyaXB0cy93cmFuZ2xpbmdfcXRzX2t3LlIiKQoKIyBydW4gZGF0YSBjYXRlZ29yaXphdGlvbiBzY3JpcHQKc291cmNlKCIvVXNlcnMva3dlaXNtYW4vRG9jdW1lbnRzL1Jlc2VhcmNoIChTdGFuZm9yZCkvUHJvamVjdHMvVGVtcGxldG9uIEdyYW50L0RBVEEgV1JBTkdMSU5HL3RlbXBsZXRvbl9xdHMvc2NyaXB0cy9jYXRlZ29yaWVzX3F0c19rdy5SIikKCiMgc2V0IGtleQprZXkgPC0ga2V5X3NjCmBgYAoKVGhpcyBpcyBhIGZpcnN0LXBhc3MgZXhwbG9yYXRpb24gb2Ygc29tZSBvZiB0aGUgcmVsYXRpb25zaGlwcyBhbW9uZyBRVFMgZGF0YSBmb3IgdGhlICJTcGlyaXR1YWwgY3VyaW9zaXR5IiBpbnRlcnZpZXcuCgojIFRpbWUgcHJheWluZyAmIHNwaXJpdHVhbCBleHBlcmllbmNlcwoqUmVxdWVzdGVkIGJ5IEpvc2gqCgojIyBUaW1lIHByYXlpbmcgYXMgaW5kZXhlZCBieSBgcHJheWZyZXFtaW5gCl9Ib3cgbWFueSBtaW51dGVzIGVhY2ggZGF5IGRvIHlvdSBkbyB0aGF0IG9uIGF2ZXJhZ2UgdGhyb3VnaG91dCB0aGUgd2Vlaz8gW3VzZSByZWFsIHdvcmxkIGV4YW1wbGVzLCBhc2sgYWxvbmU/IFdpdGggb3RoZXJzPyBQcm9iZSBhd2F5LS0gQW5zd2VyIHdpdGggaW50ZXJ2aWV3ZXIganVkZ2VtZW50IGZvciBhbnN3ZXJzXV8KCmBgYHtyfQpwcmF5ZnJlcW1pbl9jb3VudCA8LSBkICU+JQogIGZpbHRlcighaXMubmEocHJheWZyZXFtaW4pLCAhaXMubmEoZ29kdm94YWxvdWQpLAogICAgICAgICBwcmF5ZnJlcW1pbiAhPSAiT3RoZXIiLCBnb2R2b3hhbG91ZCAhPSAiT3RoZXIiKSAlPiUKICBjb3VudChjb3VudHJ5LCBwcmF5ZnJlcW1pbikgJT4lCiAgZGF0YS5mcmFtZSgpCgpwcmF5ZnJlcW1pbl9jb3VudF9ieV9xdWFkIDwtIGQgJT4lCiAgZmlsdGVyKCFpcy5uYShwcmF5ZnJlcW1pbiksICFpcy5uYShnb2R2b3hhbG91ZCksCiAgICAgICAgIHByYXlmcmVxbWluICE9ICJPdGhlciIsIGdvZHZveGFsb3VkICE9ICJPdGhlciIpICU+JQogIGNvdW50KGNvdW50cnksIHVyYmFuX3J1cmFsLCBjaGFyaXNtYXRpY19sb2NhbCwgcHJheWZyZXFtaW4pICU+JQogIGRhdGEuZnJhbWUoKQpgYGAKCiMjIyBTcGlyaXR1YWwgZXhwZXJpZW5jZXMgaW5kZXhlZCBieSBgZ29kdm94YWxvdWRgCl9Tb21lIHBlb3BsZSBzYXkgdGhhdCB0aGV5IGhhdmUgaGVhcmQgR29kKiBzcGVhayBvdXQgbG91ZCB0byB0aGVtLiBIYXMgdGhpcyBldmVyIGhhcHBlbmVkIHRvIHlvdT9fCgpgYGB7ciwgZmlnLndpZHRoID0gMywgZmlnLmFzcCA9IDF9CmQgJT4lCiAgZmlsdGVyKCFpcy5uYShwcmF5ZnJlcW1pbiksICFpcy5uYShnb2R2b3hhbG91ZCkpICU+JSAjLAogICAgICAgICAjIHByYXlmcmVxbWluICE9ICJPdGhlciIsIGdvZHZveGFsb3VkICE9ICJPdGhlciIpICU+JQogIGdncGxvdChhZXMoeCA9IHByYXlmcmVxbWluLCB5ID0gZ29kdm94YWxvdWQsIGNvbG9yID0gcmVzZWFyY2hlcikpICsKICBmYWNldF9ncmlkKHVyYmFuX3J1cmFsIH4gY2hhcmlzbWF0aWNfbG9jYWwgfiBjb3VudHJ5KSArCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuMywgcG9zaXRpb24gPSBwb3NpdGlvbl9qaXR0ZXIoMC4yLCAwLjIpKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGN1c3RvbV9wYWwpICsKICBsYWJzKHRpdGxlID0gcGFzdGUoInByYXlmcmVxbWluIiwgImdvZHZveGFsb3VkIiwgc2VwID0gIiB4ICIpLAogICAgICAgIyBzdWJ0aXRsZSA9ICJFeGNsdWRpbmcgcGVvcGxlIHdobyBkaWQgbm90IGhhdmUgYSBjbGVhciBhbnN3ZXIiLAogICAgICAgeCA9ICJwcmF5ZnJlcW1pbiIsCiAgICAgICB5ID0gImdvZHZveGFsb3VkIiwKICAgICAgIGNvbG9yID0gIlJlc2VhcmNoZXIiKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInRvcCIsCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgaGp1c3QgPSAxLCB2anVzdCA9IDAuNSkpICsKICBndWlkZXMoY29sb3IgPSBndWlkZV9sZWdlbmQobmNvbCA9IDYsIGJ5cm93ID0gVFJVRSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJyaWRlLmFlcyA9IGxpc3QoYWxwaGEgPSAxKSkpCmBgYAoKYGBge3IsIGZpZy53aWR0aCA9IDQsIGZpZy5hc3AgPSAxfQpkICU+JQogIGZpbHRlcighaXMubmEocHJheWZyZXFtaW4pLCAhaXMubmEoZ29kdm94YWxvdWQpLAogICAgICAgICBwcmF5ZnJlcW1pbiAhPSAiT3RoZXIiLCBnb2R2b3hhbG91ZCAhPSAiT3RoZXIiKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBwcmF5ZnJlcW1pbiwgYWxwaGEgPSBnb2R2b3hhbG91ZCwgZmlsbCA9IHJlc2VhcmNoZXIpKSArCiAgZmFjZXRfZ3JpZCh1cmJhbl9ydXJhbCB+IGNoYXJpc21hdGljX2xvY2FsIH4gY291bnRyeSkgKwogIGdlb21fYmFyKHBvc2l0aW9uID0gImZpbGwiKSArCiAgZ2VvbV90ZXh0KGRhdGEgPSBwcmF5ZnJlcW1pbl9jb3VudF9ieV9xdWFkLAogICAgICAgICAgICBhZXMoeCA9IHByYXlmcmVxbWluLCB5ID0gMSwgYWxwaGEgPSBOVUxMLCBmaWxsID0gTlVMTCwKICAgICAgICAgICAgICAgIGxhYmVsID0gcGFzdGUwKCIobj0iLCBuLCAiKSIpKSwKICAgICAgICAgICAgc2l6ZSA9IDIsIG51ZGdlX3kgPSAwLjA1KSArCiAgIyBzY2FsZV9maWxsX2JyZXdlcihndWlkZSA9IE5VTEwsIHBhbGV0dGUgPSAiRGFyazIiKSArCiAgc2NhbGVfZmlsbF9tYW51YWwoZ3VpZGUgPSBOVUxMLCB2YWx1ZXMgPSBjdXN0b21fcGFsKSArCiAgc2NhbGVfYWxwaGFfZGlzY3JldGUocmFuZ2UgPSBjKDAuNSwgMSkpICsKICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDEsIDAuMjUpKSArCiAgbGFicyh0aXRsZSA9IHBhc3RlKCJwcmF5ZnJlcW1pbiIsICJnb2R2b3hhbG91ZCIsIHNlcCA9ICIgeCAiKSwKICAgICAgIHN1YnRpdGxlID0gIkV4Y2x1ZGluZyBwZW9wbGUgd2hvIGRpZCBub3QgaGF2ZSBhIGNsZWFyIGFuc3dlciIsCiAgICAgICB4ID0gInByYXlmcmVxbWluIiwKICAgICAgIHkgPSAiUHJvcG9ydGlvbiIsCiAgICAgICBhbHBoYSA9ICJnb2R2b3hhbG91ZCIsCiAgICAgICBmaWxsID0gIlJlc2VhcmNoZXIiKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInRvcCIsCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgaGp1c3QgPSAxLCB2anVzdCA9IDAuNSkpICsKICBndWlkZXMoYWxwaGEgPSBndWlkZV9sZWdlbmQoKSwKICAgICAgICAgZmlsbCA9ICJub25lIikKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gNCwgZmlnLmFzcCA9IDAuNX0KZCAlPiUKICBmaWx0ZXIoIWlzLm5hKHByYXlmcmVxbWluKSwgIWlzLm5hKGdvZHZveGFsb3VkKSwKICAgICAgICAgcHJheWZyZXFtaW4gIT0gIk90aGVyIiwgZ29kdm94YWxvdWQgIT0gIk90aGVyIikgJT4lCiAgZ2dwbG90KGFlcyh4ID0gcHJheWZyZXFtaW4sIGFscGhhID0gZ29kdm94YWxvdWQsIGZpbGwgPSBjb3VudHJ5KSkgKwogIGZhY2V0X2dyaWQoLiB+IGNvdW50cnkpICsKICBnZW9tX2Jhcihwb3NpdGlvbiA9ICJmaWxsIikgKwogIGdlb21fdGV4dChkYXRhID0gcHJheWZyZXFtaW5fY291bnQsCiAgICAgICAgICAgIGFlcyh4ID0gcHJheWZyZXFtaW4sIHkgPSAxLCBhbHBoYSA9IE5VTEwsIGZpbGwgPSBOVUxMLAogICAgICAgICAgICAgICAgbGFiZWwgPSBwYXN0ZTAoIihuPSIsIG4sICIpIikpLAogICAgICAgICAgICBzaXplID0gMiwgbnVkZ2VfeSA9IDAuMDUpICsKICBzY2FsZV9maWxsX2JyZXdlcihndWlkZSA9IE5VTEwsIHBhbGV0dGUgPSAiRGFyazIiKSArCiAgIyBzY2FsZV9maWxsX21hbnVhbChndWlkZSA9IE5VTEwsIHZhbHVlcyA9IGN1c3RvbV9wYWwpICsKICBzY2FsZV9hbHBoYV9kaXNjcmV0ZShyYW5nZSA9IGMoMC41LCAxKSkgKwogIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgMSwgMC4yNSkpICsKICBsYWJzKHRpdGxlID0gcGFzdGUoInByYXlmcmVxbWluIiwgImdvZHZveGFsb3VkIiwgc2VwID0gIiB4ICIpLAogICAgICAgc3VidGl0bGUgPSAiRXhjbHVkaW5nIHBlb3BsZSB3aG8gZGlkIG5vdCBoYXZlIGEgY2xlYXIgYW5zd2VyIiwKICAgICAgIHggPSAicHJheWZyZXFtaW4iLAogICAgICAgeSA9ICJQcm9wb3J0aW9uIiwKICAgICAgIGFscGhhID0gImdvZHZveGFsb3VkIiwKICAgICAgIGZpbGwgPSAiUmVzZWFyY2hlciIpICsKICB0aGVtZV9idygpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIiwKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCBoanVzdCA9IDEsIHZqdXN0ID0gMC41KSkgKwogIGd1aWRlcyhhbHBoYSA9IGd1aWRlX2xlZ2VuZCgpLAogICAgICAgICBmaWxsID0gIm5vbmUiKQpgYGAKCmBgYHtyfQpkMSA8LSBkICU+JQogIGZpbHRlcighaXMubmEocHJheWZyZXFtaW4pLCAhaXMubmEoZ29kdm94YWxvdWQpLAogICAgICAgICBwcmF5ZnJlcW1pbiAhPSAiT3RoZXIiLCBnb2R2b3hhbG91ZCAhPSAiT3RoZXIiKSAlPiUKICBtdXRhdGUocHJheWZyZXFtaW5fbnVtID0gYXMubnVtZXJpYyhwcmF5ZnJlcW1pbikgLSAxLAogICAgICAgICBnb2R2b3hhbG91ZCA9IGZhY3Rvcihnb2R2b3hhbG91ZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoIk5vIiwgIlllcyIpKSwKICAgICAgICAgZ29kdm94YWxvdWRfbnVtID0gYXMubnVtZXJpYyhnb2R2b3hhbG91ZCkgLSAxKSAlPiUKICBzZWxlY3QoY291bnRyeSwgcmVzZWFyY2hlciwgdXJiYW5fcnVyYWwsIGNoYXJpc21hdGljX2xvY2FsLCBzdWJqZWN0X25hbWUsCiAgICAgICAgIHN0YXJ0c193aXRoKCJwcmF5ZnJlcW1pbiIpLCBzdGFydHNfd2l0aCgiZ29kdm94YWxvdWQiKSkKCmNvbnRyYXN0cyhkMSRjb3VudHJ5KSA8LSBjYmluZCgiR0giID0gYygtMSwgMSwgMCwgMCwgMCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVEgiID0gYygtMSwgMCwgMSwgMCwgMCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0giID0gYygtMSwgMCwgMCwgMSwgMCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlQiID0gYygtMSwgMCwgMCwgMCwgMSkpCmNvbnRyYXN0cyhkMSRwcmF5ZnJlcW1pbikgPC0gY29udHIucG9seSg0KQoKcjEgPC0gZ2xtKGdvZHZveGFsb3VkX251bSB+IHByYXlmcmVxbWluICsgY291bnRyeSwKICAgICAgICAgICAgICAgICAgZmFtaWx5ID0gImJpbm9taWFsIiwgZGF0YSA9IGQxKQpzdW1tYXJ5KHIxKQpgYGAKCiMjIyBTcGlyaXR1YWwgZXhwZXJpZW5jZXMgaW5kZXhlZCBieSBgZ29kdmlhdmlzaW9uc2AKX1NvbWUgcGVvcGxlIHNheSB0aGF0IHRoZXkgaGF2ZSBoYWQgYSB2aXNpb24gZnJvbSBHb2Qq4oCUdGhleSBoYXZlIGEgcGljdHVyZSwgYnV0IGl0IGlzIGxpa2UgdGhleSBzZWUgaXQgd2l0aCB0aGVpciBleWVzLiBIYXMgYW55dGhpbmcgbGlrZSB0aGF0IGhhcHBlbmVkIHRvIHlvdT9fCgpgYGB7ciwgZmlnLndpZHRoID0gMywgZmlnLmFzcCA9IDF9CmQgJT4lCiAgZmlsdGVyKCFpcy5uYShwcmF5ZnJlcW1pbiksICFpcy5uYShnb2R2aWF2aXNpb25zKSkgJT4lICMsCiAgICAgICAgICMgcHJheWZyZXFtaW4gIT0gIk90aGVyIiwgZ29kdmlhdmlzaW9ucyAhPSAiT3RoZXIiKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBwcmF5ZnJlcW1pbiwgeSA9IGdvZHZpYXZpc2lvbnMsIGNvbG9yID0gcmVzZWFyY2hlcikpICsKICBmYWNldF9ncmlkKHVyYmFuX3J1cmFsIH4gY2hhcmlzbWF0aWNfbG9jYWwgfiBjb3VudHJ5KSArCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuMywgcG9zaXRpb24gPSBwb3NpdGlvbl9qaXR0ZXIoMC4yLCAwLjIpKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGN1c3RvbV9wYWwpICsKICBsYWJzKHRpdGxlID0gcGFzdGUoInByYXlmcmVxbWluIiwgImdvZHZpYXZpc2lvbnMiLCBzZXAgPSAiIHggIiksCiAgICAgICAjIHN1YnRpdGxlID0gIkV4Y2x1ZGluZyBwZW9wbGUgd2hvIGRpZCBub3QgaGF2ZSBhIGNsZWFyIGFuc3dlciIsCiAgICAgICB4ID0gInByYXlmcmVxbWluIiwKICAgICAgIHkgPSAiZ29kdmlhdmlzaW9ucyIsCiAgICAgICBjb2xvciA9ICJSZXNlYXJjaGVyIikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiLAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIGhqdXN0ID0gMSwgdmp1c3QgPSAwLjUpKSArCiAgZ3VpZGVzKGNvbG9yID0gZ3VpZGVfbGVnZW5kKG5jb2wgPSA2LCBieXJvdyA9IFRSVUUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVycmlkZS5hZXMgPSBsaXN0KGFscGhhID0gMSkpKQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSA0LCBmaWcuYXNwID0gMX0KZCAlPiUKICBmaWx0ZXIoIWlzLm5hKHByYXlmcmVxbWluKSwgIWlzLm5hKGdvZHZpYXZpc2lvbnMpLAogICAgICAgICBwcmF5ZnJlcW1pbiAhPSAiT3RoZXIiLCBnb2R2aWF2aXNpb25zICE9ICJPdGhlciIpICU+JQogIGdncGxvdChhZXMoeCA9IHByYXlmcmVxbWluLCBhbHBoYSA9IGdvZHZpYXZpc2lvbnMsIGZpbGwgPSByZXNlYXJjaGVyKSkgKwogIGZhY2V0X2dyaWQodXJiYW5fcnVyYWwgfiBjaGFyaXNtYXRpY19sb2NhbCB+IGNvdW50cnkpICsKICBnZW9tX2Jhcihwb3NpdGlvbiA9ICJmaWxsIikgKwogIGdlb21fdGV4dChkYXRhID0gcHJheWZyZXFtaW5fY291bnRfYnlfcXVhZCwKICAgICAgICAgICAgYWVzKHggPSBwcmF5ZnJlcW1pbiwgeSA9IDEsIGFscGhhID0gTlVMTCwgZmlsbCA9IE5VTEwsCiAgICAgICAgICAgICAgICBsYWJlbCA9IHBhc3RlMCgiKG49IiwgbiwgIikiKSksCiAgICAgICAgICAgIHNpemUgPSAyLCBudWRnZV95ID0gMC4wNSkgKwogICMgc2NhbGVfZmlsbF9icmV3ZXIoZ3VpZGUgPSBOVUxMLCBwYWxldHRlID0gIkRhcmsyIikgKwogIHNjYWxlX2ZpbGxfbWFudWFsKGd1aWRlID0gTlVMTCwgdmFsdWVzID0gY3VzdG9tX3BhbCkgKwogIHNjYWxlX2FscGhhX2Rpc2NyZXRlKHJhbmdlID0gYygwLjUsIDEpKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCAxLCAwLjI1KSkgKwogIGxhYnModGl0bGUgPSBwYXN0ZSgicHJheWZyZXFtaW4iLCAiZ29kdmlhdmlzaW9ucyIsIHNlcCA9ICIgeCAiKSwKICAgICAgIHN1YnRpdGxlID0gIkV4Y2x1ZGluZyBwZW9wbGUgd2hvIGRpZCBub3QgaGF2ZSBhIGNsZWFyIGFuc3dlciIsCiAgICAgICB4ID0gInByYXlmcmVxbWluIiwKICAgICAgIHkgPSAiUHJvcG9ydGlvbiIsCiAgICAgICBhbHBoYSA9ICJnb2R2aWF2aXNpb25zIiwKICAgICAgIGZpbGwgPSAiUmVzZWFyY2hlciIpICsKICB0aGVtZV9idygpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIiwKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCBoanVzdCA9IDEsIHZqdXN0ID0gMC41KSkgKwogIGd1aWRlcyhhbHBoYSA9IGd1aWRlX2xlZ2VuZCgpLAogICAgICAgICBmaWxsID0gIm5vbmUiKQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSA0LCBmaWcuYXNwID0gMC41fQpkICU+JQogIGZpbHRlcighaXMubmEocHJheWZyZXFtaW4pLCAhaXMubmEoZ29kdmlhdmlzaW9ucyksCiAgICAgICAgIHByYXlmcmVxbWluICE9ICJPdGhlciIsIGdvZHZpYXZpc2lvbnMgIT0gIk90aGVyIikgJT4lCiAgZ2dwbG90KGFlcyh4ID0gcHJheWZyZXFtaW4sIGFscGhhID0gZ29kdmlhdmlzaW9ucywgZmlsbCA9IGNvdW50cnkpKSArCiAgZmFjZXRfZ3JpZCguIH4gY291bnRyeSkgKwogIGdlb21fYmFyKHBvc2l0aW9uID0gImZpbGwiKSArCiAgZ2VvbV90ZXh0KGRhdGEgPSBwcmF5ZnJlcW1pbl9jb3VudCwKICAgICAgICAgICAgYWVzKHggPSBwcmF5ZnJlcW1pbiwgeSA9IDEsIGFscGhhID0gTlVMTCwgZmlsbCA9IE5VTEwsCiAgICAgICAgICAgICAgICBsYWJlbCA9IHBhc3RlMCgiKG49IiwgbiwgIikiKSksCiAgICAgICAgICAgIHNpemUgPSAyLCBudWRnZV95ID0gMC4wNSkgKwogIHNjYWxlX2ZpbGxfYnJld2VyKGd1aWRlID0gTlVMTCwgcGFsZXR0ZSA9ICJEYXJrMiIpICsKICAjIHNjYWxlX2ZpbGxfbWFudWFsKGd1aWRlID0gTlVMTCwgdmFsdWVzID0gY3VzdG9tX3BhbCkgKwogIHNjYWxlX2FscGhhX2Rpc2NyZXRlKHJhbmdlID0gYygwLjUsIDEpKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCAxLCAwLjI1KSkgKwogIGxhYnModGl0bGUgPSBwYXN0ZSgicHJheWZyZXFtaW4iLCAiZ29kdmlhdmlzaW9ucyIsIHNlcCA9ICIgeCAiKSwKICAgICAgIHN1YnRpdGxlID0gIkV4Y2x1ZGluZyBwZW9wbGUgd2hvIGRpZCBub3QgaGF2ZSBhIGNsZWFyIGFuc3dlciIsCiAgICAgICB4ID0gInByYXlmcmVxbWluIiwKICAgICAgIHkgPSAiUHJvcG9ydGlvbiIsCiAgICAgICBhbHBoYSA9ICJnb2R2aWF2aXNpb25zIiwKICAgICAgIGZpbGwgPSAiUmVzZWFyY2hlciIpICsKICB0aGVtZV9idygpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIiwKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCBoanVzdCA9IDEsIHZqdXN0ID0gMC41KSkgKwogIGd1aWRlcyhhbHBoYSA9IGd1aWRlX2xlZ2VuZCgpLAogICAgICAgICBmaWxsID0gIm5vbmUiKQpgYGAKCmBgYHtyfQpkMiA8LSBkICU+JQogIGZpbHRlcighaXMubmEocHJheWZyZXFtaW4pLCAhaXMubmEoZ29kdmlhdmlzaW9ucyksCiAgICAgICAgIHByYXlmcmVxbWluICE9ICJPdGhlciIsIGdvZHZpYXZpc2lvbnMgIT0gIk90aGVyIikgJT4lCiAgbXV0YXRlKHByYXlmcmVxbWluX251bSA9IGFzLm51bWVyaWMocHJheWZyZXFtaW4pIC0gMSwKICAgICAgICAgZ29kdmlhdmlzaW9ucyA9IGZhY3Rvcihnb2R2aWF2aXNpb25zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygiTm8iLCAiWWVzIikpLAogICAgICAgICBnb2R2aWF2aXNpb25zX251bSA9IGFzLm51bWVyaWMoZ29kdmlhdmlzaW9ucykgLSAxKSAlPiUKICBzZWxlY3QoY291bnRyeSwgcmVzZWFyY2hlciwgdXJiYW5fcnVyYWwsIGNoYXJpc21hdGljX2xvY2FsLCBzdWJqZWN0X25hbWUsCiAgICAgICAgIHN0YXJ0c193aXRoKCJwcmF5ZnJlcW1pbiIpLCBzdGFydHNfd2l0aCgiZ29kdmlhdmlzaW9ucyIpKQoKY29udHJhc3RzKGQyJGNvdW50cnkpIDwtIGNiaW5kKCJHSCIgPSBjKC0xLCAxLCAwLCAwLCAwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUSCIgPSBjKC0xLCAwLCAxLCAwLCAwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDSCIgPSBjKC0xLCAwLCAwLCAxLCAwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVCIgPSBjKC0xLCAwLCAwLCAwLCAxKSkKY29udHJhc3RzKGQyJHByYXlmcmVxbWluKSA8LSBjb250ci5wb2x5KDQpCgpyMiA8LSBnbG0oZ29kdmlhdmlzaW9uc19udW0gfiBwcmF5ZnJlcW1pbiArIGNvdW50cnksCiAgICAgICAgICAgICAgICAgIGZhbWlseSA9ICJiaW5vbWlhbCIsIGRhdGEgPSBkMikKc3VtbWFyeShyMikKYGBgCgojIyMgU3Bpcml0dWFsIGV4cGVyaWVuY2VzIGluZGV4ZWQgYnkgYGdvZHZpYWJvZHlleHBlcmllbmNlc2AKX1NvbWUgcGVvcGxlIGhhdmUgcGFydGljdWxhciBleHBlcmllbmNlcyBpbiB5b3VyIGJvZHkgdGhhdCB0aGV5IGFzc29jaWF0ZSB3aXRoIEdvZCogb3Igc3Bpcml0LiBEb2VzIHRoYXQgaGFwcGVuIGZvciB5b3U/IFtleGFtcGxlczogd2FybSBoYW5kcywgZ29vc2VidW1wcywgZmlyZSBpbiB0aGUgYmVsbHldXwoKYGBge3IsIGZpZy53aWR0aCA9IDMsIGZpZy5hc3AgPSAxfQpkICU+JQogIGZpbHRlcighaXMubmEocHJheWZyZXFtaW4pLCAhaXMubmEoZ29kdmlhYm9keWV4cGVyaWVuY2VzKSkgJT4lICMsCiAgICAgICAgICMgcHJheWZyZXFtaW4gIT0gIk90aGVyIiwgZ29kdmlhYm9keWV4cGVyaWVuY2VzICE9ICJPdGhlciIpICU+JQogIGdncGxvdChhZXMoeCA9IHByYXlmcmVxbWluLCB5ID0gZ29kdmlhYm9keWV4cGVyaWVuY2VzLCBjb2xvciA9IHJlc2VhcmNoZXIpKSArCiAgZmFjZXRfZ3JpZCh1cmJhbl9ydXJhbCB+IGNoYXJpc21hdGljX2xvY2FsIH4gY291bnRyeSkgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjMsIHBvc2l0aW9uID0gcG9zaXRpb25faml0dGVyKDAuMiwgMC4yKSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjdXN0b21fcGFsKSArCiAgbGFicyh0aXRsZSA9IHBhc3RlKCJwcmF5ZnJlcW1pbiIsICJnb2R2aWFib2R5ZXhwZXJpZW5jZXMiLCBzZXAgPSAiIHggIiksCiAgICAgICAjIHN1YnRpdGxlID0gIkV4Y2x1ZGluZyBwZW9wbGUgd2hvIGRpZCBub3QgaGF2ZSBhIGNsZWFyIGFuc3dlciIsCiAgICAgICB4ID0gInByYXlmcmVxbWluIiwKICAgICAgIHkgPSAiZ29kdmlhYm9keWV4cGVyaWVuY2VzIiwKICAgICAgIGNvbG9yID0gIlJlc2VhcmNoZXIiKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInRvcCIsCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgaGp1c3QgPSAxLCB2anVzdCA9IDAuNSkpICsKICBndWlkZXMoY29sb3IgPSBndWlkZV9sZWdlbmQobmNvbCA9IDYsIGJ5cm93ID0gVFJVRSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJyaWRlLmFlcyA9IGxpc3QoYWxwaGEgPSAxKSkpCmBgYAoKYGBge3IsIGZpZy53aWR0aCA9IDQsIGZpZy5hc3AgPSAxfQpkICU+JQogIGZpbHRlcighaXMubmEocHJheWZyZXFtaW4pLCAhaXMubmEoZ29kdmlhYm9keWV4cGVyaWVuY2VzKSwKICAgICAgICAgcHJheWZyZXFtaW4gIT0gIk90aGVyIiwgZ29kdmlhYm9keWV4cGVyaWVuY2VzICE9ICJPdGhlciIpICU+JQogIGdncGxvdChhZXMoeCA9IHByYXlmcmVxbWluLCBhbHBoYSA9IGdvZHZpYWJvZHlleHBlcmllbmNlcywgZmlsbCA9IHJlc2VhcmNoZXIpKSArCiAgZmFjZXRfZ3JpZCh1cmJhbl9ydXJhbCB+IGNoYXJpc21hdGljX2xvY2FsIH4gY291bnRyeSkgKwogIGdlb21fYmFyKHBvc2l0aW9uID0gImZpbGwiKSArCiAgZ2VvbV90ZXh0KGRhdGEgPSBwcmF5ZnJlcW1pbl9jb3VudF9ieV9xdWFkLAogICAgICAgICAgICBhZXMoeCA9IHByYXlmcmVxbWluLCB5ID0gMSwgYWxwaGEgPSBOVUxMLCBmaWxsID0gTlVMTCwKICAgICAgICAgICAgICAgIGxhYmVsID0gcGFzdGUwKCIobj0iLCBuLCAiKSIpKSwKICAgICAgICAgICAgc2l6ZSA9IDIsIG51ZGdlX3kgPSAwLjA1KSArCiAgIyBzY2FsZV9maWxsX2JyZXdlcihndWlkZSA9IE5VTEwsIHBhbGV0dGUgPSAiRGFyazIiKSArCiAgc2NhbGVfZmlsbF9tYW51YWwoZ3VpZGUgPSBOVUxMLCB2YWx1ZXMgPSBjdXN0b21fcGFsKSArCiAgc2NhbGVfYWxwaGFfZGlzY3JldGUocmFuZ2UgPSBjKDAuNSwgMSkpICsKICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDEsIDAuMjUpKSArCiAgbGFicyh0aXRsZSA9IHBhc3RlKCJwcmF5ZnJlcW1pbiIsICJnb2R2aWFib2R5ZXhwZXJpZW5jZXMiLCBzZXAgPSAiIHggIiksCiAgICAgICBzdWJ0aXRsZSA9ICJFeGNsdWRpbmcgcGVvcGxlIHdobyBkaWQgbm90IGhhdmUgYSBjbGVhciBhbnN3ZXIiLAogICAgICAgeCA9ICJwcmF5ZnJlcW1pbiIsCiAgICAgICB5ID0gIlByb3BvcnRpb24iLAogICAgICAgYWxwaGEgPSAiZ29kdmlhYm9keWV4cGVyaWVuY2VzIiwKICAgICAgIGZpbGwgPSAiUmVzZWFyY2hlciIpICsKICB0aGVtZV9idygpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIiwKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCBoanVzdCA9IDEsIHZqdXN0ID0gMC41KSkgKwogIGd1aWRlcyhhbHBoYSA9IGd1aWRlX2xlZ2VuZCgpLAogICAgICAgICBmaWxsID0gIm5vbmUiKQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSA0LCBmaWcuYXNwID0gMC41fQpkICU+JQogIGZpbHRlcighaXMubmEocHJheWZyZXFtaW4pLCAhaXMubmEoZ29kdmlhYm9keWV4cGVyaWVuY2VzKSwKICAgICAgICAgcHJheWZyZXFtaW4gIT0gIk90aGVyIiwgZ29kdmlhYm9keWV4cGVyaWVuY2VzICE9ICJPdGhlciIpICU+JQogIGdncGxvdChhZXMoeCA9IHByYXlmcmVxbWluLCBhbHBoYSA9IGdvZHZpYWJvZHlleHBlcmllbmNlcywgZmlsbCA9IGNvdW50cnkpKSArCiAgZmFjZXRfZ3JpZCguIH4gY291bnRyeSkgKwogIGdlb21fYmFyKHBvc2l0aW9uID0gImZpbGwiKSArCiAgZ2VvbV90ZXh0KGRhdGEgPSBwcmF5ZnJlcW1pbl9jb3VudCwKICAgICAgICAgICAgYWVzKHggPSBwcmF5ZnJlcW1pbiwgeSA9IDEsIGFscGhhID0gTlVMTCwgZmlsbCA9IE5VTEwsCiAgICAgICAgICAgICAgICBsYWJlbCA9IHBhc3RlMCgiKG49IiwgbiwgIikiKSksCiAgICAgICAgICAgIHNpemUgPSAyLCBudWRnZV95ID0gMC4wNSkgKwogIHNjYWxlX2ZpbGxfYnJld2VyKGd1aWRlID0gTlVMTCwgcGFsZXR0ZSA9ICJEYXJrMiIpICsKICAjIHNjYWxlX2ZpbGxfbWFudWFsKGd1aWRlID0gTlVMTCwgdmFsdWVzID0gY3VzdG9tX3BhbCkgKwogIHNjYWxlX2FscGhhX2Rpc2NyZXRlKHJhbmdlID0gYygwLjUsIDEpKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCAxLCAwLjI1KSkgKwogIGxhYnModGl0bGUgPSBwYXN0ZSgicHJheWZyZXFtaW4iLCAiZ29kdmlhYm9keWV4cGVyaWVuY2VzIiwgc2VwID0gIiB4ICIpLAogICAgICAgc3VidGl0bGUgPSAiRXhjbHVkaW5nIHBlb3BsZSB3aG8gZGlkIG5vdCBoYXZlIGEgY2xlYXIgYW5zd2VyIiwKICAgICAgIHggPSAicHJheWZyZXFtaW4iLAogICAgICAgeSA9ICJQcm9wb3J0aW9uIiwKICAgICAgIGFscGhhID0gImdvZHZpYWJvZHlleHBlcmllbmNlcyIsCiAgICAgICBmaWxsID0gIlJlc2VhcmNoZXIiKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInRvcCIsCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgaGp1c3QgPSAxLCB2anVzdCA9IDAuNSkpICsKICBndWlkZXMoYWxwaGEgPSBndWlkZV9sZWdlbmQoKSwKICAgICAgICAgZmlsbCA9ICJub25lIikKYGBgCgpgYGB7cn0KZDMgPC0gZCAlPiUKICBmaWx0ZXIoIWlzLm5hKHByYXlmcmVxbWluKSwgIWlzLm5hKGdvZHZpYWJvZHlleHBlcmllbmNlcyksCiAgICAgICAgIHByYXlmcmVxbWluICE9ICJPdGhlciIsIGdvZHZpYWJvZHlleHBlcmllbmNlcyAhPSAiT3RoZXIiKSAlPiUKICBtdXRhdGUocHJheWZyZXFtaW5fbnVtID0gYXMubnVtZXJpYyhwcmF5ZnJlcW1pbikgLSAxLAogICAgICAgICBnb2R2aWFib2R5ZXhwZXJpZW5jZXMgPSBmYWN0b3IoZ29kdmlhYm9keWV4cGVyaWVuY2VzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygiTm8iLCAiWWVzIikpLAogICAgICAgICBnb2R2aWFib2R5ZXhwZXJpZW5jZXNfbnVtID0gYXMubnVtZXJpYyhnb2R2aWFib2R5ZXhwZXJpZW5jZXMpIC0gMSkgJT4lCiAgc2VsZWN0KGNvdW50cnksIHJlc2VhcmNoZXIsIHVyYmFuX3J1cmFsLCBjaGFyaXNtYXRpY19sb2NhbCwgc3ViamVjdF9uYW1lLAogICAgICAgICBzdGFydHNfd2l0aCgicHJheWZyZXFtaW4iKSwgc3RhcnRzX3dpdGgoImdvZHZpYWJvZHlleHBlcmllbmNlcyIpKQoKY29udHJhc3RzKGQzJGNvdW50cnkpIDwtIGNiaW5kKCJHSCIgPSBjKC0xLCAxLCAwLCAwLCAwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUSCIgPSBjKC0xLCAwLCAxLCAwLCAwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDSCIgPSBjKC0xLCAwLCAwLCAxLCAwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVCIgPSBjKC0xLCAwLCAwLCAwLCAxKSkKY29udHJhc3RzKGQzJHByYXlmcmVxbWluKSA8LSBjb250ci5wb2x5KDQpCgpyMyA8LSBnbG0oZ29kdmlhYm9keWV4cGVyaWVuY2VzX251bSB+IHByYXlmcmVxbWluICsgY291bnRyeSwKICAgICAgICAgICAgICAgICAgZmFtaWx5ID0gImJpbm9taWFsIiwgZGF0YSA9IGQzKQpzdW1tYXJ5KHIzKQpgYGAKCiMjIyBBZ2dyZWdhdGUgc3Bpcml0dWFsIGV4cGVyaWVuY2VzIHNjb3JlCgpgYGB7ciwgZmlnLndpZHRoID0gMywgZmlnLmFzcCA9IDF9CmRfc3Bpcml0ICU+JQogIGZpbHRlcighaXMubmEocHJheWZyZXFtaW4pLCAhaXMubmEoc3BleF9zY29yZSkpICU+JQogIGRpc3RpbmN0KGNvdW50cnksIHJlc2VhcmNoZXIsIHVyYmFuX3J1cmFsLCBjaGFyaXNtYXRpY19sb2NhbCwKICAgICAgICAgICBzdWJqZWN0X25hbWUsIHByYXlmcmVxbWluLCBzcGV4X3Njb3JlKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBwcmF5ZnJlcW1pbiwgeSA9IHNwZXhfc2NvcmUsIGNvbG9yID0gcmVzZWFyY2hlcikpICsKICBmYWNldF9ncmlkKHVyYmFuX3J1cmFsIH4gY2hhcmlzbWF0aWNfbG9jYWwgfiBjb3VudHJ5KSArCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuMywgcG9zaXRpb24gPSBwb3NpdGlvbl9qaXR0ZXIoMC4yLCAwKSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjdXN0b21fcGFsKSArCiAgbGFicyh0aXRsZSA9IHBhc3RlKCJwcmF5ZnJlcW1pbiIsICJzcGV4X3Njb3JlIiwgc2VwID0gIiB4ICIpLAogICAgICAgIyBzdWJ0aXRsZSA9ICJFeGNsdWRpbmcgcGVvcGxlIHdobyBkaWQgbm90IGhhdmUgYSBjbGVhciBhbnN3ZXIiLAogICAgICAgeCA9ICJwcmF5ZnJlcW1pbiIsCiAgICAgICB5ID0gInNwZXhfc2NvcmUiLAogICAgICAgY29sb3IgPSAiUmVzZWFyY2hlciIpICsKICB0aGVtZV9idygpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIiwKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCBoanVzdCA9IDEsIHZqdXN0ID0gMC41KSkgKwogIGd1aWRlcyhjb2xvciA9IGd1aWRlX2xlZ2VuZChuY29sID0gNiwgYnlyb3cgPSBUUlVFLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcnJpZGUuYWVzID0gbGlzdChhbHBoYSA9IDEpKSkKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gMywgZmlnLmFzcCA9IDAuNn0KZF9zcGlyaXQgJT4lCiAgZmlsdGVyKCFpcy5uYShwcmF5ZnJlcW1pbiksICFpcy5uYShzcGV4X3Njb3JlKSkgJT4lCiAgZGlzdGluY3QoY291bnRyeSwgcmVzZWFyY2hlciwgdXJiYW5fcnVyYWwsIGNoYXJpc21hdGljX2xvY2FsLAogICAgICAgICAgIHN1YmplY3RfbmFtZSwgcHJheWZyZXFtaW4sIHNwZXhfc2NvcmUpICU+JQogIGdncGxvdChhZXMoeCA9IHByYXlmcmVxbWluLCB5ID0gc3BleF9zY29yZSwgCiAgICAgICAgICAgICBjb2xvciA9IGNvdW50cnksIGZpbGwgPSBjb3VudHJ5LCBncm91cCA9IGNvdW50cnkpKSArCiAgZmFjZXRfZ3JpZCguIH4gY291bnRyeSkgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjMsIHBvc2l0aW9uID0gcG9zaXRpb25faml0dGVyKDAuMiwgMCkpICsKICBnZW9tX3Ntb290aChhZXMoeCA9IGFzLm51bWVyaWMocHJheWZyZXFtaW4pKSwgbWV0aG9kID0gImxtIikgKwogICMgZ2VvbV9zbW9vdGgoYWVzKHggPSBhcy5udW1lcmljKHByYXlmcmVxbWluKSksIG1ldGhvZCA9ICJsb2VzcyIpICsKICAjIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjdXN0b21fcGFsKSArCiAgIyBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjdXN0b21fcGFsKSArCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGUgPSAiRGFyazIiKSArCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIpICsKICBsYWJzKHRpdGxlID0gcGFzdGUoInByYXlmcmVxbWluIiwgInNwZXhfc2NvcmUiLCBzZXAgPSAiIHggIiksCiAgICAgICAjIHN1YnRpdGxlID0gIkV4Y2x1ZGluZyBwZW9wbGUgd2hvIGRpZCBub3QgaGF2ZSBhIGNsZWFyIGFuc3dlciIsCiAgICAgICB4ID0gInByYXlmcmVxbWluIiwKICAgICAgIHkgPSAic3BleF9zY29yZSIsCiAgICAgICBjb2xvciA9ICJSZXNlYXJjaGVyIiwgZmlsbCA9ICJSZXNlYXJjaGVyIikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiLAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIGhqdXN0ID0gMSwgdmp1c3QgPSAwLjUpKSArCiAgZ3VpZGVzKGNvbG9yID0gZ3VpZGVfbGVnZW5kKG5jb2wgPSA2LCBieXJvdyA9IFRSVUUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVycmlkZS5hZXMgPSBsaXN0KGFscGhhID0gMSkpLAogICAgICAgICBmaWxsID0gZ3VpZGVfbGVnZW5kKG5jb2wgPSA2LCBieXJvdyA9IFRSVUUpKQpgYGAKCmBgYHtyfQpkX2FnZzEgPC0gZF9zcGlyaXQgJT4lCiAgZmlsdGVyKCFpcy5uYShwcmF5ZnJlcW1pbiksICFpcy5uYShzcGV4X3Njb3JlKSwKICAgICAgICAgcHJheWZyZXFtaW4gIT0gIk90aGVyIiwgc3BleF9zY29yZSAhPSAiT3RoZXIiKSAlPiUKICAjIGRpc3RpbmN0KGNvdW50cnksIHJlc2VhcmNoZXIsIHVyYmFuX3J1cmFsLCBjaGFyaXNtYXRpY19sb2NhbCwKICAjICAgICAgICAgIHN1YmplY3RfbmFtZSwgcHJheWZyZXFtaW4sIHNwZXhfc2NvcmUpICU+JQogIG11dGF0ZShwcmF5ZnJlcW1pbl9udW0gPSBhcy5udW1lcmljKHByYXlmcmVxbWluKSAtIDEpICMgJT4lCiAgIyBzZWxlY3QoY291bnRyeSwgcmVzZWFyY2hlciwgdXJiYW5fcnVyYWwsIGNoYXJpc21hdGljX2xvY2FsLCBzdWJqZWN0X25hbWUsCiAgIyAgICAgICAgc3RhcnRzX3dpdGgoInByYXlmcmVxbWluIiksIHN0YXJ0c193aXRoKCJzcGV4X3Njb3JlIikpCgpjb250cmFzdHMoZF9hZ2cxJGNvdW50cnkpIDwtIGNiaW5kKCJHSCIgPSBjKC0xLCAxLCAwLCAwLCAwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUSCIgPSBjKC0xLCAwLCAxLCAwLCAwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDSCIgPSBjKC0xLCAwLCAwLCAxLCAwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVCIgPSBjKC0xLCAwLCAwLCAwLCAxKSkKY29udHJhc3RzKGRfYWdnMSRwcmF5ZnJlcW1pbikgPC0gY29udHIucG9seSg0KQoKcl9hZ2cxIDwtIGxtZXIocmVzcG9uc2UgfiBwcmF5ZnJlcW1pbiArIGNvdW50cnkgCiAgICAgICAgICAgICAgICsgKDEgfCBzdWJqZWN0X25hbWUpICsgKDEgfCBxdWVzdGlvbiksIAogICAgICAgICAgICAgICBkYXRhID0gZF9hZ2cxKQpzdW1tYXJ5KHJfYWdnMSkKCnJfYWdnMiA8LSBsbWVyKHJlc3BvbnNlIH4gcHJheWZyZXFtaW4gKiBjb3VudHJ5IAogICAgICAgICAgICAgICArICgxIHwgc3ViamVjdF9uYW1lKSArICgxIHwgcXVlc3Rpb24pLCAKICAgICAgICAgICAgICAgZGF0YSA9IGRfYWdnMSkKc3VtbWFyeShyX2FnZzIpCgphbm92YShyX2FnZzEsIHJfYWdnMikKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gMywgZmlnLmFzcCA9IDAuNn0KZF9yX2FnZzFfcHJlZGljdGVkIDwtIGRfYWdnMSAlPiUKICBtdXRhdGUocmVzcG9uc2VfcHJlZCA9IHByZWRpY3Qocl9hZ2cxLCBkX2FnZzEpKSAlPiUKICBncm91cF9ieShzdWJqZWN0X25hbWUpICU+JQogIG11dGF0ZShzcGV4X3Njb3JlX3ByZWQgPSBzdW0ocmVzcG9uc2VfcHJlZCwgbmEucm0gPSBUKSkgJT4lCiAgdW5ncm91cCgpICU+JQogIGdyb3VwX2J5KGNvdW50cnksIHByYXlmcmVxbWluKSAlPiUKICBkbyhkYXRhLmZyYW1lKHJiaW5kKHNtZWFuLmNsLmJvb3QoLiRzcGV4X3Njb3JlX3ByZWQpKSkpCgpkX3NwaXJpdCAlPiUKICBmaWx0ZXIoIWlzLm5hKHByYXlmcmVxbWluKSwgIWlzLm5hKHNwZXhfc2NvcmUpKSAlPiUKICBkaXN0aW5jdChjb3VudHJ5LCByZXNlYXJjaGVyLCB1cmJhbl9ydXJhbCwgY2hhcmlzbWF0aWNfbG9jYWwsCiAgICAgICAgICAgc3ViamVjdF9uYW1lLCBwcmF5ZnJlcW1pbiwgc3BleF9zY29yZSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gcHJheWZyZXFtaW4sIHkgPSBzcGV4X3Njb3JlLCAKICAgICAgICAgICAgIGNvbG9yID0gY291bnRyeSwgZmlsbCA9IGNvdW50cnksIGdyb3VwID0gY291bnRyeSkpICsKICBmYWNldF9ncmlkKC4gfiBjb3VudHJ5KSArCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuMywgcG9zaXRpb24gPSBwb3NpdGlvbl9qaXR0ZXIoMC4yLCAwKSkgKwogIGdlb21fbGluZShkYXRhID0gZF9yX2FnZzFfcHJlZGljdGVkLCBhZXMoeSA9IE1lYW4pKSArCiAgZ2VvbV9yaWJib24oZGF0YSA9IGRfcl9hZ2cxX3ByZWRpY3RlZCwgCiAgICAgICAgICAgICAgYWVzKHltaW4gPSBMb3dlciwgeW1heCA9IFVwcGVyLCB5ID0gTlVMTCksIAogICAgICAgICAgICAgIGFscGhhID0gMC41LCBzaXplID0gMCkgKwogICMgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGN1c3RvbV9wYWwpICsKICAjIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGN1c3RvbV9wYWwpICsKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIpICsKICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIkRhcmsyIikgKwogIGxhYnModGl0bGUgPSBwYXN0ZSgicHJheWZyZXFtaW4iLCAic3BleF9zY29yZSIsIHNlcCA9ICIgeCAiKSwKICAgICAgIHN1YnRpdGxlID0gIkxpbmVzIGFyZSBwcmVkaWN0aW9ucyBmcm9tIGEgbWl4ZWQgZWZmZWN0cyBsaW5lYXIgcmVncmVzc2lvbjpcbmxtZXIocmVzcG9uc2UgfiBwcmF5ZnJlcW1pbiArIGNvdW50cnkgKyAoMSB8IHN1YmplY3RfbmFtZSkgKyAoMSB8IHF1ZXN0aW9uKSIsCiAgICAgICB4ID0gInByYXlmcmVxbWluIiwKICAgICAgIHkgPSAic3BleF9zY29yZSIsCiAgICAgICBjb2xvciA9ICJTaXRlIiwgZmlsbCA9ICJTaXRlIikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiLAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIGhqdXN0ID0gMSwgdmp1c3QgPSAwLjUpKSArCiAgZ3VpZGVzKGNvbG9yID0gIm5vbmUiLAogICAgICAgICBmaWxsID0gIm5vbmUiKQpgYGAKCiMjIyBMb29raW5nIGp1c3QgYXQgJ2FwcGxlcycgKHVyYmFuIGNoYXJpc21hdGljcykKCmBgYHtyLCBmaWcud2lkdGggPSAzLCBmaWcuYXNwID0gMC41fQpkX3NwaXJpdCAlPiUKICBmaWx0ZXIoIWlzLm5hKHByYXlmcmVxbWluKSwgIWlzLm5hKHNwZXhfc2NvcmUpLAogICAgICAgICBxdWFkID09ICJ1cmJhbiBjaGFyaXNtYXRpYyIpICU+JQogIGRpc3RpbmN0KGNvdW50cnksIHJlc2VhcmNoZXIsIGNoYXJpc21hdGljX2xvY2FsLCB1cmJhbl9ydXJhbCwgCiAgICAgICAgICAgc3ViamVjdF9uYW1lLCBwcmF5ZnJlcW1pbiwgc3BleF9zY29yZSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gcHJheWZyZXFtaW4sIHkgPSBzcGV4X3Njb3JlLCAKICAgICAgICAgICAgIGNvbG9yID0gY291bnRyeSwgZmlsbCA9IGNvdW50cnksIGdyb3VwID0gY291bnRyeSkpICsKICBmYWNldF9ncmlkKGNoYXJpc21hdGljX2xvY2FsIH4gdXJiYW5fcnVyYWwgfiBjb3VudHJ5KSArCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuMywgcG9zaXRpb24gPSBwb3NpdGlvbl9qaXR0ZXIoMC4yLCAwKSkgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIpICsKICAjIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjdXN0b21fcGFsKSArCiAgIyBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjdXN0b21fcGFsKSArCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGUgPSAiRGFyazIiKSArCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIpICsKICBsYWJzKHRpdGxlID0gcGFzdGUoInByYXlmcmVxbWluIiwgInNwZXhfc2NvcmUiLCBzZXAgPSAiIHggIiksCiAgICAgICAjIHN1YnRpdGxlID0gIkxpbmVzIGFyZSBwcmVkaWN0aW9ucyBmcm9tIGEgbWl4ZWQgZWZmZWN0cyBsaW5lYXIgcmVncmVzc2lvbjpcbmxtZXIocmVzcG9uc2UgfiBwcmF5ZnJlcW1pbiArIGNvdW50cnkgKyAoMSB8IHN1YmplY3RfbmFtZSkgKyAoMSB8IHF1ZXN0aW9uKSIsCiAgICAgICB4ID0gInByYXlmcmVxbWluIiwKICAgICAgIHkgPSAic3BleF9zY29yZSIsCiAgICAgICBjb2xvciA9ICJTaXRlIiwgZmlsbCA9ICJTaXRlIikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiLAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIGhqdXN0ID0gMSwgdmp1c3QgPSAwLjUpKSArCiAgZ3VpZGVzKGNvbG9yID0gIm5vbmUiLAogICAgICAgICBmaWxsID0gIm5vbmUiKQpgYGAKCiMjIyBMb29raW5nIGF0IGFsbCBjaGFyaXNtYXRpY3MKCmBgYHtyLCBmaWcud2lkdGggPSAzLCBmaWcuYXNwID0gMC41fQpkX3NwaXJpdCAlPiUKICBmaWx0ZXIoIWlzLm5hKHByYXlmcmVxbWluKSwgIWlzLm5hKHNwZXhfc2NvcmUpLAogICAgICAgICBjaGFyaXNtYXRpY19sb2NhbCA9PSAiY2hhcmlzbWF0aWMiKSAlPiUKICBkaXN0aW5jdChjb3VudHJ5LCByZXNlYXJjaGVyLCBjaGFyaXNtYXRpY19sb2NhbCwgdXJiYW5fcnVyYWwsIAogICAgICAgICAgIHN1YmplY3RfbmFtZSwgcHJheWZyZXFtaW4sIHNwZXhfc2NvcmUpICU+JQogIGdncGxvdChhZXMoeCA9IHByYXlmcmVxbWluLCB5ID0gc3BleF9zY29yZSwgCiAgICAgICAgICAgICBjb2xvciA9IGNvdW50cnksIGZpbGwgPSBjb3VudHJ5LCBncm91cCA9IGNvdW50cnkpKSArCiAgZmFjZXRfZ3JpZChjaGFyaXNtYXRpY19sb2NhbCB+IGNvdW50cnkpICsKICBnZW9tX3BvaW50KGFscGhhID0gMC4zLCBwb3NpdGlvbiA9IHBvc2l0aW9uX2ppdHRlcigwLjIsIDApKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIikgKwogICMgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGN1c3RvbV9wYWwpICsKICAjIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGN1c3RvbV9wYWwpICsKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIpICsKICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIkRhcmsyIikgKwogIGxhYnModGl0bGUgPSBwYXN0ZSgicHJheWZyZXFtaW4iLCAic3BleF9zY29yZSIsIHNlcCA9ICIgeCAiKSwKICAgICAgICMgc3VidGl0bGUgPSAiTGluZXMgYXJlIHByZWRpY3Rpb25zIGZyb20gYSBtaXhlZCBlZmZlY3RzIGxpbmVhciByZWdyZXNzaW9uOlxubG1lcihyZXNwb25zZSB+IHByYXlmcmVxbWluICsgY291bnRyeSArICgxIHwgc3ViamVjdF9uYW1lKSArICgxIHwgcXVlc3Rpb24pIiwKICAgICAgIHggPSAicHJheWZyZXFtaW4iLAogICAgICAgeSA9ICJzcGV4X3Njb3JlIiwKICAgICAgIGNvbG9yID0gIlNpdGUiLCBmaWxsID0gIlNpdGUiKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInRvcCIsCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgaGp1c3QgPSAxLCB2anVzdCA9IDAuNSkpICsKICBndWlkZXMoY29sb3IgPSAibm9uZSIsCiAgICAgICAgIGZpbGwgPSAibm9uZSIpCmBgYAoKCiMgRG91YnQgJiBleHRlcm5hbCBzZW5zb3J5IGV4cGVyaWVuY2VzCipSZXF1ZXN0ZWQgYnkgRW1pbHksIEpvaG4qCgojIyAiRG91YnQiIGluZHhlZCBieSBgc2VsZnVuc3VyZWdvZHJlYWxgCgpfSGFzIHRoZXJlIGJlZW4gYSB0aW1lIHdoZW4geW91IHlvdXJzZWxmIHdvbmRlcmVkIHdoZXRoZXIgR29kKiB3YXMgcmVhbD9fCgpgYGB7cn0Kc2VsZnVuc3VyZWdvZHJlYWxfY291bnQgPC0gZCAlPiUKICBmaWx0ZXIoIWlzLm5hKHNlbGZ1bnN1cmVnb2RyZWFsKSwgIWlzLm5hKGdvZHZveGFsb3VkKSwKICAgICAgICAgc2VsZnVuc3VyZWdvZHJlYWwgIT0gIk90aGVyIiwgZ29kdm94YWxvdWQgIT0gIk90aGVyIikgJT4lCiAgY291bnQoY291bnRyeSwgc2VsZnVuc3VyZWdvZHJlYWwpICU+JQogIGRhdGEuZnJhbWUoKQoKc2VsZnVuc3VyZWdvZHJlYWxfY291bnRfYnlfcXVhZCA8LSBkICU+JQogIGZpbHRlcighaXMubmEoc2VsZnVuc3VyZWdvZHJlYWwpLCAhaXMubmEoZ29kdm94YWxvdWQpLAogICAgICAgICBzZWxmdW5zdXJlZ29kcmVhbCAhPSAiT3RoZXIiLCBnb2R2b3hhbG91ZCAhPSAiT3RoZXIiKSAlPiUKICBjb3VudChjb3VudHJ5LCB1cmJhbl9ydXJhbCwgY2hhcmlzbWF0aWNfbG9jYWwsIHNlbGZ1bnN1cmVnb2RyZWFsKSAlPiUKICBkYXRhLmZyYW1lKCkKYGBgCgojIyMgU3Bpcml0dWFsIGV4cGVyaWVuY2VzIGluZGV4ZWQgYnkgYGdvZHZveGFsb3VkYApfU29tZSBwZW9wbGUgc2F5IHRoYXQgdGhleSBoYXZlIGhlYXJkIEdvZCogc3BlYWsgb3V0IGxvdWQgdG8gdGhlbS4gSGFzIHRoaXMgZXZlciBoYXBwZW5lZCB0byB5b3U/XwoKYGBge3IsIGZpZy53aWR0aCA9IDMsIGZpZy5hc3AgPSAxfQpkICU+JQogIGZpbHRlcighaXMubmEoc2VsZnVuc3VyZWdvZHJlYWwpLCAhaXMubmEoZ29kdm94YWxvdWQpKSAlPiUgIywKICAgICAgICAgIyBzZWxmdW5zdXJlZ29kcmVhbCAhPSAiT3RoZXIiLCBnb2R2b3hhbG91ZCAhPSAiT3RoZXIiKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBzZWxmdW5zdXJlZ29kcmVhbCwgeSA9IGdvZHZveGFsb3VkLCBjb2xvciA9IHJlc2VhcmNoZXIpKSArCiAgZmFjZXRfZ3JpZCh1cmJhbl9ydXJhbCB+IGNoYXJpc21hdGljX2xvY2FsIH4gY291bnRyeSkgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjMsIHBvc2l0aW9uID0gcG9zaXRpb25faml0dGVyKDAuMiwgMC4yKSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjdXN0b21fcGFsKSArCiAgbGFicyh0aXRsZSA9IHBhc3RlKCJzZWxmdW5zdXJlZ29kcmVhbCIsICJnb2R2b3hhbG91ZCIsIHNlcCA9ICIgeCAiKSwKICAgICAgICMgc3VidGl0bGUgPSAiRXhjbHVkaW5nIHBlb3BsZSB3aG8gZGlkIG5vdCBoYXZlIGEgY2xlYXIgYW5zd2VyIiwKICAgICAgIHggPSAic2VsZnVuc3VyZWdvZHJlYWwiLAogICAgICAgeSA9ICJnb2R2b3hhbG91ZCIsCiAgICAgICBjb2xvciA9ICJSZXNlYXJjaGVyIikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiLAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIGhqdXN0ID0gMSwgdmp1c3QgPSAwLjUpKSArCiAgZ3VpZGVzKGNvbG9yID0gZ3VpZGVfbGVnZW5kKG5jb2wgPSA2LCBieXJvdyA9IFRSVUUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVycmlkZS5hZXMgPSBsaXN0KGFscGhhID0gMSkpKQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSA0LCBmaWcuYXNwID0gMX0KZCAlPiUKICBmaWx0ZXIoIWlzLm5hKHNlbGZ1bnN1cmVnb2RyZWFsKSwgIWlzLm5hKGdvZHZveGFsb3VkKSwKICAgICAgICAgc2VsZnVuc3VyZWdvZHJlYWwgIT0gIk90aGVyIiwgZ29kdm94YWxvdWQgIT0gIk90aGVyIikgJT4lCiAgZ2dwbG90KGFlcyh4ID0gc2VsZnVuc3VyZWdvZHJlYWwsIGFscGhhID0gZ29kdm94YWxvdWQsIGZpbGwgPSByZXNlYXJjaGVyKSkgKwogIGZhY2V0X2dyaWQodXJiYW5fcnVyYWwgfiBjaGFyaXNtYXRpY19sb2NhbCB+IGNvdW50cnkpICsKICBnZW9tX2Jhcihwb3NpdGlvbiA9ICJmaWxsIikgKwogIGdlb21fdGV4dChkYXRhID0gc2VsZnVuc3VyZWdvZHJlYWxfY291bnRfYnlfcXVhZCwKICAgICAgICAgICAgYWVzKHggPSBzZWxmdW5zdXJlZ29kcmVhbCwgeSA9IDEsIGFscGhhID0gTlVMTCwgZmlsbCA9IE5VTEwsCiAgICAgICAgICAgICAgICBsYWJlbCA9IHBhc3RlMCgiKG49IiwgbiwgIikiKSksCiAgICAgICAgICAgIHNpemUgPSAyLCBudWRnZV95ID0gMC4wNSkgKwogICMgc2NhbGVfZmlsbF9icmV3ZXIoZ3VpZGUgPSBOVUxMLCBwYWxldHRlID0gIkRhcmsyIikgKwogIHNjYWxlX2ZpbGxfbWFudWFsKGd1aWRlID0gTlVMTCwgdmFsdWVzID0gY3VzdG9tX3BhbCkgKwogIHNjYWxlX2FscGhhX2Rpc2NyZXRlKHJhbmdlID0gYygwLjUsIDEpKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCAxLCAwLjI1KSkgKwogIGxhYnModGl0bGUgPSBwYXN0ZSgic2VsZnVuc3VyZWdvZHJlYWwiLCAiZ29kdm94YWxvdWQiLCBzZXAgPSAiIHggIiksCiAgICAgICBzdWJ0aXRsZSA9ICJFeGNsdWRpbmcgcGVvcGxlIHdobyBkaWQgbm90IGhhdmUgYSBjbGVhciBhbnN3ZXIiLAogICAgICAgeCA9ICJzZWxmdW5zdXJlZ29kcmVhbCIsCiAgICAgICB5ID0gIlByb3BvcnRpb24iLAogICAgICAgYWxwaGEgPSAiZ29kdm94YWxvdWQiLAogICAgICAgZmlsbCA9ICJSZXNlYXJjaGVyIikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiLAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIGhqdXN0ID0gMSwgdmp1c3QgPSAwLjUpKSArCiAgZ3VpZGVzKGFscGhhID0gZ3VpZGVfbGVnZW5kKCksCiAgICAgICAgIGZpbGwgPSAibm9uZSIpCmBgYAoKYGBge3IsIGZpZy53aWR0aCA9IDQsIGZpZy5hc3AgPSAwLjV9CmQgJT4lCiAgZmlsdGVyKCFpcy5uYShzZWxmdW5zdXJlZ29kcmVhbCksICFpcy5uYShnb2R2b3hhbG91ZCksCiAgICAgICAgIHNlbGZ1bnN1cmVnb2RyZWFsICE9ICJPdGhlciIsIGdvZHZveGFsb3VkICE9ICJPdGhlciIpICU+JQogIGdncGxvdChhZXMoeCA9IHNlbGZ1bnN1cmVnb2RyZWFsLCBhbHBoYSA9IGdvZHZveGFsb3VkLCBmaWxsID0gY291bnRyeSkpICsKICBmYWNldF9ncmlkKC4gfiBjb3VudHJ5KSArCiAgZ2VvbV9iYXIocG9zaXRpb24gPSAiZmlsbCIpICsKICBnZW9tX3RleHQoZGF0YSA9IHNlbGZ1bnN1cmVnb2RyZWFsX2NvdW50LAogICAgICAgICAgICBhZXMoeCA9IHNlbGZ1bnN1cmVnb2RyZWFsLCB5ID0gMSwgYWxwaGEgPSBOVUxMLCBmaWxsID0gTlVMTCwKICAgICAgICAgICAgICAgIGxhYmVsID0gcGFzdGUwKCIobj0iLCBuLCAiKSIpKSwKICAgICAgICAgICAgc2l6ZSA9IDIsIG51ZGdlX3kgPSAwLjA1KSArCiAgc2NhbGVfZmlsbF9icmV3ZXIoZ3VpZGUgPSBOVUxMLCBwYWxldHRlID0gIkRhcmsyIikgKwogICMgc2NhbGVfZmlsbF9tYW51YWwoZ3VpZGUgPSBOVUxMLCB2YWx1ZXMgPSBjdXN0b21fcGFsKSArCiAgc2NhbGVfYWxwaGFfZGlzY3JldGUocmFuZ2UgPSBjKDAuNSwgMSkpICsKICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDEsIDAuMjUpKSArCiAgbGFicyh0aXRsZSA9IHBhc3RlKCJzZWxmdW5zdXJlZ29kcmVhbCIsICJnb2R2b3hhbG91ZCIsIHNlcCA9ICIgeCAiKSwKICAgICAgIHN1YnRpdGxlID0gIkV4Y2x1ZGluZyBwZW9wbGUgd2hvIGRpZCBub3QgaGF2ZSBhIGNsZWFyIGFuc3dlciIsCiAgICAgICB4ID0gInNlbGZ1bnN1cmVnb2RyZWFsIiwKICAgICAgIHkgPSAiUHJvcG9ydGlvbiIsCiAgICAgICBhbHBoYSA9ICJnb2R2b3hhbG91ZCIsCiAgICAgICBmaWxsID0gIlJlc2VhcmNoZXIiKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInRvcCIsCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgaGp1c3QgPSAxLCB2anVzdCA9IDAuNSkpICsKICBndWlkZXMoYWxwaGEgPSBndWlkZV9sZWdlbmQoKSwKICAgICAgICAgZmlsbCA9ICJub25lIikKYGBgCgpgYGB7cn0KZDQgPC0gZCAlPiUKICBmaWx0ZXIoIWlzLm5hKHNlbGZ1bnN1cmVnb2RyZWFsKSwgIWlzLm5hKGdvZHZveGFsb3VkKSwKICAgICAgICAgc2VsZnVuc3VyZWdvZHJlYWwgIT0gIk90aGVyIiwgZ29kdm94YWxvdWQgIT0gIk90aGVyIiwKICAgICAgICAgc2VsZnVuc3VyZWdvZHJlYWwgIT0gIk1heWJlIikgJT4lCiAgbXV0YXRlKHNlbGZ1bnN1cmVnb2RyZWFsID0gZmFjdG9yKHNlbGZ1bnN1cmVnb2RyZWFsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJObyIsICJZZXMiKSksCiAgICAgICAgIHNlbGZ1bnN1cmVnb2RyZWFsX251bSA9IGFzLm51bWVyaWMoc2VsZnVuc3VyZWdvZHJlYWwpIC0gMSwKICAgICAgICAgZ29kdm94YWxvdWQgPSBmYWN0b3IoZ29kdm94YWxvdWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJObyIsICJZZXMiKSksCiAgICAgICAgIGdvZHZveGFsb3VkX251bSA9IGFzLm51bWVyaWMoZ29kdm94YWxvdWQpIC0gMSkgJT4lCiAgc2VsZWN0KGNvdW50cnksIHJlc2VhcmNoZXIsIHVyYmFuX3J1cmFsLCBjaGFyaXNtYXRpY19sb2NhbCwgc3ViamVjdF9uYW1lLAogICAgICAgICBzdGFydHNfd2l0aCgic2VsZnVuc3VyZWdvZHJlYWwiKSwgc3RhcnRzX3dpdGgoImdvZHZveGFsb3VkIikpCgpjb250cmFzdHMoZDQkY291bnRyeSkgPC0gY2JpbmQoIkdIIiA9IGMoLTEsIDEsIDAsIDAsIDApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRIIiA9IGMoLTEsIDAsIDEsIDAsIDApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNIIiA9IGMoLTEsIDAsIDAsIDEsIDApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZUIiA9IGMoLTEsIDAsIDAsIDAsIDEpKQpjb250cmFzdHMoZDQkc2VsZnVuc3VyZWdvZHJlYWwpIDwtIGNiaW5kKCJZIiA9IGMoLTEsIDEpKQoKcjQgPC0gZ2xtKGdvZHZveGFsb3VkX251bSB+IHNlbGZ1bnN1cmVnb2RyZWFsICsgY291bnRyeSwKICAgICAgICAgICAgICAgICAgZmFtaWx5ID0gImJpbm9taWFsIiwgZGF0YSA9IGQ0KQpzdW1tYXJ5KHI0KQpgYGAKCiMjIyBTcGlyaXR1YWwgZXhwZXJpZW5jZXMgaW5kZXhlZCBieSBgZ29kdmlhdmlzaW9uc2AKX1NvbWUgcGVvcGxlIHNheSB0aGF0IHRoZXkgaGF2ZSBoYWQgYSB2aXNpb24gZnJvbSBHb2Qq4oCUdGhleSBoYXZlIGEgcGljdHVyZSwgYnV0IGl0IGlzIGxpa2UgdGhleSBzZWUgaXQgd2l0aCB0aGVpciBleWVzLiBIYXMgYW55dGhpbmcgbGlrZSB0aGF0IGhhcHBlbmVkIHRvIHlvdT9fCgpgYGB7ciwgZmlnLndpZHRoID0gMywgZmlnLmFzcCA9IDF9CmQgJT4lCiAgZmlsdGVyKCFpcy5uYShzZWxmdW5zdXJlZ29kcmVhbCksICFpcy5uYShnb2R2aWF2aXNpb25zKSkgJT4lICMsCiAgICAgICAgICMgc2VsZnVuc3VyZWdvZHJlYWwgIT0gIk90aGVyIiwgZ29kdmlhdmlzaW9ucyAhPSAiT3RoZXIiKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBzZWxmdW5zdXJlZ29kcmVhbCwgeSA9IGdvZHZpYXZpc2lvbnMsIGNvbG9yID0gcmVzZWFyY2hlcikpICsKICBmYWNldF9ncmlkKHVyYmFuX3J1cmFsIH4gY2hhcmlzbWF0aWNfbG9jYWwgfiBjb3VudHJ5KSArCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuMywgcG9zaXRpb24gPSBwb3NpdGlvbl9qaXR0ZXIoMC4yLCAwLjIpKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGN1c3RvbV9wYWwpICsKICBsYWJzKHRpdGxlID0gcGFzdGUoInNlbGZ1bnN1cmVnb2RyZWFsIiwgImdvZHZpYXZpc2lvbnMiLCBzZXAgPSAiIHggIiksCiAgICAgICAjIHN1YnRpdGxlID0gIkV4Y2x1ZGluZyBwZW9wbGUgd2hvIGRpZCBub3QgaGF2ZSBhIGNsZWFyIGFuc3dlciIsCiAgICAgICB4ID0gInNlbGZ1bnN1cmVnb2RyZWFsIiwKICAgICAgIHkgPSAiZ29kdmlhdmlzaW9ucyIsCiAgICAgICBjb2xvciA9ICJSZXNlYXJjaGVyIikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiLAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIGhqdXN0ID0gMSwgdmp1c3QgPSAwLjUpKSArCiAgZ3VpZGVzKGNvbG9yID0gZ3VpZGVfbGVnZW5kKG5jb2wgPSA2LCBieXJvdyA9IFRSVUUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVycmlkZS5hZXMgPSBsaXN0KGFscGhhID0gMSkpKQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSA0LCBmaWcuYXNwID0gMX0KZCAlPiUKICBmaWx0ZXIoIWlzLm5hKHNlbGZ1bnN1cmVnb2RyZWFsKSwgIWlzLm5hKGdvZHZpYXZpc2lvbnMpLAogICAgICAgICBzZWxmdW5zdXJlZ29kcmVhbCAhPSAiT3RoZXIiLCBnb2R2aWF2aXNpb25zICE9ICJPdGhlciIpICU+JQogIGdncGxvdChhZXMoeCA9IHNlbGZ1bnN1cmVnb2RyZWFsLCBhbHBoYSA9IGdvZHZpYXZpc2lvbnMsIGZpbGwgPSByZXNlYXJjaGVyKSkgKwogIGZhY2V0X2dyaWQodXJiYW5fcnVyYWwgfiBjaGFyaXNtYXRpY19sb2NhbCB+IGNvdW50cnkpICsKICBnZW9tX2Jhcihwb3NpdGlvbiA9ICJmaWxsIikgKwogIGdlb21fdGV4dChkYXRhID0gc2VsZnVuc3VyZWdvZHJlYWxfY291bnRfYnlfcXVhZCwKICAgICAgICAgICAgYWVzKHggPSBzZWxmdW5zdXJlZ29kcmVhbCwgeSA9IDEsIGFscGhhID0gTlVMTCwgZmlsbCA9IE5VTEwsCiAgICAgICAgICAgICAgICBsYWJlbCA9IHBhc3RlMCgiKG49IiwgbiwgIikiKSksCiAgICAgICAgICAgIHNpemUgPSAyLCBudWRnZV95ID0gMC4wNSkgKwogICMgc2NhbGVfZmlsbF9icmV3ZXIoZ3VpZGUgPSBOVUxMLCBwYWxldHRlID0gIkRhcmsyIikgKwogIHNjYWxlX2ZpbGxfbWFudWFsKGd1aWRlID0gTlVMTCwgdmFsdWVzID0gY3VzdG9tX3BhbCkgKwogIHNjYWxlX2FscGhhX2Rpc2NyZXRlKHJhbmdlID0gYygwLjUsIDEpKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCAxLCAwLjI1KSkgKwogIGxhYnModGl0bGUgPSBwYXN0ZSgic2VsZnVuc3VyZWdvZHJlYWwiLCAiZ29kdmlhdmlzaW9ucyIsIHNlcCA9ICIgeCAiKSwKICAgICAgIHN1YnRpdGxlID0gIkV4Y2x1ZGluZyBwZW9wbGUgd2hvIGRpZCBub3QgaGF2ZSBhIGNsZWFyIGFuc3dlciIsCiAgICAgICB4ID0gInNlbGZ1bnN1cmVnb2RyZWFsIiwKICAgICAgIHkgPSAiUHJvcG9ydGlvbiIsCiAgICAgICBhbHBoYSA9ICJnb2R2aWF2aXNpb25zIiwKICAgICAgIGZpbGwgPSAiUmVzZWFyY2hlciIpICsKICB0aGVtZV9idygpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIiwKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCBoanVzdCA9IDEsIHZqdXN0ID0gMC41KSkgKwogIGd1aWRlcyhhbHBoYSA9IGd1aWRlX2xlZ2VuZCgpLAogICAgICAgICBmaWxsID0gIm5vbmUiKQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSA0LCBmaWcuYXNwID0gMC41fQpkICU+JQogIGZpbHRlcighaXMubmEoc2VsZnVuc3VyZWdvZHJlYWwpLCAhaXMubmEoZ29kdmlhdmlzaW9ucyksCiAgICAgICAgIHNlbGZ1bnN1cmVnb2RyZWFsICE9ICJPdGhlciIsIGdvZHZpYXZpc2lvbnMgIT0gIk90aGVyIikgJT4lCiAgZ2dwbG90KGFlcyh4ID0gc2VsZnVuc3VyZWdvZHJlYWwsIGFscGhhID0gZ29kdmlhdmlzaW9ucywgZmlsbCA9IGNvdW50cnkpKSArCiAgZmFjZXRfZ3JpZCguIH4gY291bnRyeSkgKwogIGdlb21fYmFyKHBvc2l0aW9uID0gImZpbGwiKSArCiAgZ2VvbV90ZXh0KGRhdGEgPSBzZWxmdW5zdXJlZ29kcmVhbF9jb3VudCwKICAgICAgICAgICAgYWVzKHggPSBzZWxmdW5zdXJlZ29kcmVhbCwgeSA9IDEsIGFscGhhID0gTlVMTCwgZmlsbCA9IE5VTEwsCiAgICAgICAgICAgICAgICBsYWJlbCA9IHBhc3RlMCgiKG49IiwgbiwgIikiKSksCiAgICAgICAgICAgIHNpemUgPSAyLCBudWRnZV95ID0gMC4wNSkgKwogIHNjYWxlX2ZpbGxfYnJld2VyKGd1aWRlID0gTlVMTCwgcGFsZXR0ZSA9ICJEYXJrMiIpICsKICAjIHNjYWxlX2ZpbGxfbWFudWFsKGd1aWRlID0gTlVMTCwgdmFsdWVzID0gY3VzdG9tX3BhbCkgKwogIHNjYWxlX2FscGhhX2Rpc2NyZXRlKHJhbmdlID0gYygwLjUsIDEpKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCAxLCAwLjI1KSkgKwogIGxhYnModGl0bGUgPSBwYXN0ZSgic2VsZnVuc3VyZWdvZHJlYWwiLCAiZ29kdmlhdmlzaW9ucyIsIHNlcCA9ICIgeCAiKSwKICAgICAgIHN1YnRpdGxlID0gIkV4Y2x1ZGluZyBwZW9wbGUgd2hvIGRpZCBub3QgaGF2ZSBhIGNsZWFyIGFuc3dlciIsCiAgICAgICB4ID0gInNlbGZ1bnN1cmVnb2RyZWFsIiwKICAgICAgIHkgPSAiUHJvcG9ydGlvbiIsCiAgICAgICBhbHBoYSA9ICJnb2R2aWF2aXNpb25zIiwKICAgICAgIGZpbGwgPSAiUmVzZWFyY2hlciIpICsKICB0aGVtZV9idygpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIiwKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCBoanVzdCA9IDEsIHZqdXN0ID0gMC41KSkgKwogIGd1aWRlcyhhbHBoYSA9IGd1aWRlX2xlZ2VuZCgpLAogICAgICAgICBmaWxsID0gIm5vbmUiKQpgYGAKCmBgYHtyfQpkNSA8LSBkICU+JQogIGZpbHRlcighaXMubmEoc2VsZnVuc3VyZWdvZHJlYWwpLCAhaXMubmEoZ29kdmlhdmlzaW9ucyksCiAgICAgICAgIHNlbGZ1bnN1cmVnb2RyZWFsICE9ICJPdGhlciIsIGdvZHZpYXZpc2lvbnMgIT0gIk90aGVyIiwKICAgICAgICAgc2VsZnVuc3VyZWdvZHJlYWwgIT0gIk1heWJlIikgJT4lCiAgbXV0YXRlKHNlbGZ1bnN1cmVnb2RyZWFsID0gZmFjdG9yKHNlbGZ1bnN1cmVnb2RyZWFsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJObyIsICJZZXMiKSksCiAgICAgICAgIHNlbGZ1bnN1cmVnb2RyZWFsX251bSA9IGFzLm51bWVyaWMoc2VsZnVuc3VyZWdvZHJlYWwpIC0gMSwKICAgICAgICAgZ29kdmlhdmlzaW9ucyA9IGZhY3Rvcihnb2R2aWF2aXNpb25zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygiTm8iLCAiWWVzIikpLAogICAgICAgICBnb2R2aWF2aXNpb25zX251bSA9IGFzLm51bWVyaWMoZ29kdmlhdmlzaW9ucykgLSAxKSAlPiUKICBzZWxlY3QoY291bnRyeSwgcmVzZWFyY2hlciwgdXJiYW5fcnVyYWwsIGNoYXJpc21hdGljX2xvY2FsLCBzdWJqZWN0X25hbWUsCiAgICAgICAgIHN0YXJ0c193aXRoKCJzZWxmdW5zdXJlZ29kcmVhbCIpLCBzdGFydHNfd2l0aCgiZ29kdmlhdmlzaW9ucyIpKQoKY29udHJhc3RzKGQ1JGNvdW50cnkpIDwtIGNiaW5kKCJHSCIgPSBjKC0xLCAxLCAwLCAwLCAwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUSCIgPSBjKC0xLCAwLCAxLCAwLCAwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDSCIgPSBjKC0xLCAwLCAwLCAxLCAwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVCIgPSBjKC0xLCAwLCAwLCAwLCAxKSkKY29udHJhc3RzKGQ1JHNlbGZ1bnN1cmVnb2RyZWFsKSA8LSBjYmluZCgiWSIgPSBjKC0xLCAxKSkKCnI1IDwtIGdsbShnb2R2aWF2aXNpb25zX251bSB+IHNlbGZ1bnN1cmVnb2RyZWFsICsgY291bnRyeSwKICAgICAgICAgICAgICAgICAgZmFtaWx5ID0gImJpbm9taWFsIiwgZGF0YSA9IGQ1KQpzdW1tYXJ5KHI1KQpgYGAKCiMjIyBTcGlyaXR1YWwgZXhwZXJpZW5jZXMgaW5kZXhlZCBieSBgZ29kdmlhYm9keWV4cGVyaWVuY2VzYApfU29tZSBwZW9wbGUgaGF2ZSBwYXJ0aWN1bGFyIGV4cGVyaWVuY2VzIGluIHlvdXIgYm9keSB0aGF0IHRoZXkgYXNzb2NpYXRlIHdpdGggR29kKiBvciBzcGlyaXQuIERvZXMgdGhhdCBoYXBwZW4gZm9yIHlvdT8gW2V4YW1wbGVzOiB3YXJtIGhhbmRzLCBnb29zZWJ1bXBzLCBmaXJlIGluIHRoZSBiZWxseV1fCgpgYGB7ciwgZmlnLndpZHRoID0gMywgZmlnLmFzcCA9IDF9CmQgJT4lCiAgZmlsdGVyKCFpcy5uYShzZWxmdW5zdXJlZ29kcmVhbCksICFpcy5uYShnb2R2aWFib2R5ZXhwZXJpZW5jZXMpKSAlPiUgIywKICAgICAgICAgIyBzZWxmdW5zdXJlZ29kcmVhbCAhPSAiT3RoZXIiLCBnb2R2aWFib2R5ZXhwZXJpZW5jZXMgIT0gIk90aGVyIikgJT4lCiAgZ2dwbG90KGFlcyh4ID0gc2VsZnVuc3VyZWdvZHJlYWwsIHkgPSBnb2R2aWFib2R5ZXhwZXJpZW5jZXMsIGNvbG9yID0gcmVzZWFyY2hlcikpICsKICBmYWNldF9ncmlkKHVyYmFuX3J1cmFsIH4gY2hhcmlzbWF0aWNfbG9jYWwgfiBjb3VudHJ5KSArCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuMywgcG9zaXRpb24gPSBwb3NpdGlvbl9qaXR0ZXIoMC4yLCAwLjIpKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGN1c3RvbV9wYWwpICsKICBsYWJzKHRpdGxlID0gcGFzdGUoInNlbGZ1bnN1cmVnb2RyZWFsIiwgImdvZHZpYWJvZHlleHBlcmllbmNlcyIsIHNlcCA9ICIgeCAiKSwKICAgICAgICMgc3VidGl0bGUgPSAiRXhjbHVkaW5nIHBlb3BsZSB3aG8gZGlkIG5vdCBoYXZlIGEgY2xlYXIgYW5zd2VyIiwKICAgICAgIHggPSAic2VsZnVuc3VyZWdvZHJlYWwiLAogICAgICAgeSA9ICJnb2R2aWFib2R5ZXhwZXJpZW5jZXMiLAogICAgICAgY29sb3IgPSAiUmVzZWFyY2hlciIpICsKICB0aGVtZV9idygpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIiwKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCBoanVzdCA9IDEsIHZqdXN0ID0gMC41KSkgKwogIGd1aWRlcyhjb2xvciA9IGd1aWRlX2xlZ2VuZChuY29sID0gNiwgYnlyb3cgPSBUUlVFLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcnJpZGUuYWVzID0gbGlzdChhbHBoYSA9IDEpKSkKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gNCwgZmlnLmFzcCA9IDF9CmQgJT4lCiAgZmlsdGVyKCFpcy5uYShzZWxmdW5zdXJlZ29kcmVhbCksICFpcy5uYShnb2R2aWFib2R5ZXhwZXJpZW5jZXMpLAogICAgICAgICBzZWxmdW5zdXJlZ29kcmVhbCAhPSAiT3RoZXIiLCBnb2R2aWFib2R5ZXhwZXJpZW5jZXMgIT0gIk90aGVyIikgJT4lCiAgZ2dwbG90KGFlcyh4ID0gc2VsZnVuc3VyZWdvZHJlYWwsIGFscGhhID0gZ29kdmlhYm9keWV4cGVyaWVuY2VzLCBmaWxsID0gcmVzZWFyY2hlcikpICsKICBmYWNldF9ncmlkKHVyYmFuX3J1cmFsIH4gY2hhcmlzbWF0aWNfbG9jYWwgfiBjb3VudHJ5KSArCiAgZ2VvbV9iYXIocG9zaXRpb24gPSAiZmlsbCIpICsKICBnZW9tX3RleHQoZGF0YSA9IHNlbGZ1bnN1cmVnb2RyZWFsX2NvdW50X2J5X3F1YWQsCiAgICAgICAgICAgIGFlcyh4ID0gc2VsZnVuc3VyZWdvZHJlYWwsIHkgPSAxLCBhbHBoYSA9IE5VTEwsIGZpbGwgPSBOVUxMLAogICAgICAgICAgICAgICAgbGFiZWwgPSBwYXN0ZTAoIihuPSIsIG4sICIpIikpLAogICAgICAgICAgICBzaXplID0gMiwgbnVkZ2VfeSA9IDAuMDUpICsKICAjIHNjYWxlX2ZpbGxfYnJld2VyKGd1aWRlID0gTlVMTCwgcGFsZXR0ZSA9ICJEYXJrMiIpICsKICBzY2FsZV9maWxsX21hbnVhbChndWlkZSA9IE5VTEwsIHZhbHVlcyA9IGN1c3RvbV9wYWwpICsKICBzY2FsZV9hbHBoYV9kaXNjcmV0ZShyYW5nZSA9IGMoMC41LCAxKSkgKwogIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgMSwgMC4yNSkpICsKICBsYWJzKHRpdGxlID0gcGFzdGUoInNlbGZ1bnN1cmVnb2RyZWFsIiwgImdvZHZpYWJvZHlleHBlcmllbmNlcyIsIHNlcCA9ICIgeCAiKSwKICAgICAgIHN1YnRpdGxlID0gIkV4Y2x1ZGluZyBwZW9wbGUgd2hvIGRpZCBub3QgaGF2ZSBhIGNsZWFyIGFuc3dlciIsCiAgICAgICB4ID0gInNlbGZ1bnN1cmVnb2RyZWFsIiwKICAgICAgIHkgPSAiUHJvcG9ydGlvbiIsCiAgICAgICBhbHBoYSA9ICJnb2R2aWFib2R5ZXhwZXJpZW5jZXMiLAogICAgICAgZmlsbCA9ICJSZXNlYXJjaGVyIikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiLAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIGhqdXN0ID0gMSwgdmp1c3QgPSAwLjUpKSArCiAgZ3VpZGVzKGFscGhhID0gZ3VpZGVfbGVnZW5kKCksCiAgICAgICAgIGZpbGwgPSAibm9uZSIpCmBgYAoKYGBge3IsIGZpZy53aWR0aCA9IDQsIGZpZy5hc3AgPSAwLjV9CmQgJT4lCiAgZmlsdGVyKCFpcy5uYShzZWxmdW5zdXJlZ29kcmVhbCksICFpcy5uYShnb2R2aWFib2R5ZXhwZXJpZW5jZXMpLAogICAgICAgICBzZWxmdW5zdXJlZ29kcmVhbCAhPSAiT3RoZXIiLCBnb2R2aWFib2R5ZXhwZXJpZW5jZXMgIT0gIk90aGVyIikgJT4lCiAgZ2dwbG90KGFlcyh4ID0gc2VsZnVuc3VyZWdvZHJlYWwsIGFscGhhID0gZ29kdmlhYm9keWV4cGVyaWVuY2VzLCBmaWxsID0gY291bnRyeSkpICsKICBmYWNldF9ncmlkKC4gfiBjb3VudHJ5KSArCiAgZ2VvbV9iYXIocG9zaXRpb24gPSAiZmlsbCIpICsKICBnZW9tX3RleHQoZGF0YSA9IHNlbGZ1bnN1cmVnb2RyZWFsX2NvdW50LAogICAgICAgICAgICBhZXMoeCA9IHNlbGZ1bnN1cmVnb2RyZWFsLCB5ID0gMSwgYWxwaGEgPSBOVUxMLCBmaWxsID0gTlVMTCwKICAgICAgICAgICAgICAgIGxhYmVsID0gcGFzdGUwKCIobj0iLCBuLCAiKSIpKSwKICAgICAgICAgICAgc2l6ZSA9IDIsIG51ZGdlX3kgPSAwLjA1KSArCiAgc2NhbGVfZmlsbF9icmV3ZXIoZ3VpZGUgPSBOVUxMLCBwYWxldHRlID0gIkRhcmsyIikgKwogICMgc2NhbGVfZmlsbF9tYW51YWwoZ3VpZGUgPSBOVUxMLCB2YWx1ZXMgPSBjdXN0b21fcGFsKSArCiAgc2NhbGVfYWxwaGFfZGlzY3JldGUocmFuZ2UgPSBjKDAuNSwgMSkpICsKICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDEsIDAuMjUpKSArCiAgbGFicyh0aXRsZSA9IHBhc3RlKCJzZWxmdW5zdXJlZ29kcmVhbCIsICJnb2R2aWFib2R5ZXhwZXJpZW5jZXMiLCBzZXAgPSAiIHggIiksCiAgICAgICBzdWJ0aXRsZSA9ICJFeGNsdWRpbmcgcGVvcGxlIHdobyBkaWQgbm90IGhhdmUgYSBjbGVhciBhbnN3ZXIiLAogICAgICAgeCA9ICJzZWxmdW5zdXJlZ29kcmVhbCIsCiAgICAgICB5ID0gIlByb3BvcnRpb24iLAogICAgICAgYWxwaGEgPSAiZ29kdmlhYm9keWV4cGVyaWVuY2VzIiwKICAgICAgIGZpbGwgPSAiUmVzZWFyY2hlciIpICsKICB0aGVtZV9idygpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIiwKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCBoanVzdCA9IDEsIHZqdXN0ID0gMC41KSkgKwogIGd1aWRlcyhhbHBoYSA9IGd1aWRlX2xlZ2VuZCgpLAogICAgICAgICBmaWxsID0gIm5vbmUiKQpgYGAKCmBgYHtyfQpkNiA8LSBkICU+JQogIGZpbHRlcighaXMubmEoc2VsZnVuc3VyZWdvZHJlYWwpLCAhaXMubmEoZ29kdmlhYm9keWV4cGVyaWVuY2VzKSwKICAgICAgICAgc2VsZnVuc3VyZWdvZHJlYWwgIT0gIk90aGVyIiwgZ29kdmlhYm9keWV4cGVyaWVuY2VzICE9ICJPdGhlciIsCiAgICAgICAgIHNlbGZ1bnN1cmVnb2RyZWFsICE9ICJNYXliZSIpICU+JQogIG11dGF0ZShzZWxmdW5zdXJlZ29kcmVhbCA9IGZhY3RvcihzZWxmdW5zdXJlZ29kcmVhbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygiTm8iLCAiWWVzIikpLAogICAgICAgICBzZWxmdW5zdXJlZ29kcmVhbF9udW0gPSBhcy5udW1lcmljKHNlbGZ1bnN1cmVnb2RyZWFsKSAtIDEsCiAgICAgICAgIGdvZHZpYWJvZHlleHBlcmllbmNlcyA9IGZhY3Rvcihnb2R2aWFib2R5ZXhwZXJpZW5jZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJObyIsICJZZXMiKSksCiAgICAgICAgIGdvZHZpYWJvZHlleHBlcmllbmNlc19udW0gPSBhcy5udW1lcmljKGdvZHZpYWJvZHlleHBlcmllbmNlcykgLSAxKSAlPiUKICBzZWxlY3QoY291bnRyeSwgcmVzZWFyY2hlciwgdXJiYW5fcnVyYWwsIGNoYXJpc21hdGljX2xvY2FsLCBzdWJqZWN0X25hbWUsCiAgICAgICAgIHN0YXJ0c193aXRoKCJzZWxmdW5zdXJlZ29kcmVhbCIpLCBzdGFydHNfd2l0aCgiZ29kdmlhYm9keWV4cGVyaWVuY2VzIikpCgpjb250cmFzdHMoZDYkY291bnRyeSkgPC0gY2JpbmQoIkdIIiA9IGMoLTEsIDEsIDAsIDAsIDApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRIIiA9IGMoLTEsIDAsIDEsIDAsIDApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNIIiA9IGMoLTEsIDAsIDAsIDEsIDApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZUIiA9IGMoLTEsIDAsIDAsIDAsIDEpKQpjb250cmFzdHMoZDYkc2VsZnVuc3VyZWdvZHJlYWwpIDwtIGNiaW5kKCJZIiA9IGMoLTEsIDEpKQoKcjYgPC0gZ2xtKGdvZHZpYWJvZHlleHBlcmllbmNlc19udW0gfiBzZWxmdW5zdXJlZ29kcmVhbCArIGNvdW50cnksCiAgICAgICAgICAgICAgICAgIGZhbWlseSA9ICJiaW5vbWlhbCIsIGRhdGEgPSBkNikKc3VtbWFyeShyNikKYGBgCgojIyAiRG91YnQiIGluZHhlZCBieSBgbW9yZXF1ZXNtb3JlYW5zd3JgCgpfRG8geW91IHRoaW5rIHRoYXQgdGhlIG1vcmUgc3Bpcml0dWFsbHkgbWF0dXJlIHlvdSBiZWNvbWUsIHlvdSB3aWxsIGRpc2NvdmVyIG1vcmUgcXVlc3Rpb25zIG9yIG1vcmUgYW5zd2Vycz9fCgpgYGB7cn0KbW9yZXF1ZXNtb3JlYW5zd3JfY291bnQgPC0gZCAlPiUKICBmaWx0ZXIoIWlzLm5hKG1vcmVxdWVzbW9yZWFuc3dyKSwgIWlzLm5hKGdvZHZveGFsb3VkKSwKICAgICAgICAgbW9yZXF1ZXNtb3JlYW5zd3IgIT0gIk90aGVyIiwgZ29kdm94YWxvdWQgIT0gIk90aGVyIikgJT4lCiAgY291bnQoY291bnRyeSwgbW9yZXF1ZXNtb3JlYW5zd3IpICU+JQogIGRhdGEuZnJhbWUoKQoKbW9yZXF1ZXNtb3JlYW5zd3JfY291bnRfYnlfcXVhZCA8LSBkICU+JQogIGZpbHRlcighaXMubmEobW9yZXF1ZXNtb3JlYW5zd3IpLCAhaXMubmEoZ29kdm94YWxvdWQpLAogICAgICAgICBtb3JlcXVlc21vcmVhbnN3ciAhPSAiT3RoZXIiLCBnb2R2b3hhbG91ZCAhPSAiT3RoZXIiKSAlPiUKICBjb3VudChjb3VudHJ5LCB1cmJhbl9ydXJhbCwgY2hhcmlzbWF0aWNfbG9jYWwsIG1vcmVxdWVzbW9yZWFuc3dyKSAlPiUKICBkYXRhLmZyYW1lKCkKYGBgCgojIyMgU3Bpcml0dWFsIGV4cGVyaWVuY2VzIGluZGV4ZWQgYnkgYGdvZHZveGFsb3VkYApfU29tZSBwZW9wbGUgc2F5IHRoYXQgdGhleSBoYXZlIGhlYXJkIEdvZCogc3BlYWsgb3V0IGxvdWQgdG8gdGhlbS4gSGFzIHRoaXMgZXZlciBoYXBwZW5lZCB0byB5b3U/XwoKYGBge3IsIGZpZy53aWR0aCA9IDMsIGZpZy5hc3AgPSAxfQpkICU+JQogIGZpbHRlcighaXMubmEobW9yZXF1ZXNtb3JlYW5zd3IpLCAhaXMubmEoZ29kdm94YWxvdWQpKSAlPiUgIywKICAgICAgICAgIyBtb3JlcXVlc21vcmVhbnN3ciAhPSAiT3RoZXIiLCBnb2R2b3hhbG91ZCAhPSAiT3RoZXIiKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBtb3JlcXVlc21vcmVhbnN3ciwgeSA9IGdvZHZveGFsb3VkLCBjb2xvciA9IHJlc2VhcmNoZXIpKSArCiAgZmFjZXRfZ3JpZCh1cmJhbl9ydXJhbCB+IGNoYXJpc21hdGljX2xvY2FsIH4gY291bnRyeSkgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjMsIHBvc2l0aW9uID0gcG9zaXRpb25faml0dGVyKDAuMiwgMC4yKSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjdXN0b21fcGFsKSArCiAgbGFicyh0aXRsZSA9IHBhc3RlKCJtb3JlcXVlc21vcmVhbnN3ciIsICJnb2R2b3hhbG91ZCIsIHNlcCA9ICIgeCAiKSwKICAgICAgICMgc3VidGl0bGUgPSAiRXhjbHVkaW5nIHBlb3BsZSB3aG8gZGlkIG5vdCBoYXZlIGEgY2xlYXIgYW5zd2VyIiwKICAgICAgIHggPSAibW9yZXF1ZXNtb3JlYW5zd3IiLAogICAgICAgeSA9ICJnb2R2b3hhbG91ZCIsCiAgICAgICBjb2xvciA9ICJSZXNlYXJjaGVyIikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiLAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIGhqdXN0ID0gMSwgdmp1c3QgPSAwLjUpKSArCiAgZ3VpZGVzKGNvbG9yID0gZ3VpZGVfbGVnZW5kKG5jb2wgPSA2LCBieXJvdyA9IFRSVUUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVycmlkZS5hZXMgPSBsaXN0KGFscGhhID0gMSkpKQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSA0LCBmaWcuYXNwID0gMX0KZCAlPiUKICBmaWx0ZXIoIWlzLm5hKG1vcmVxdWVzbW9yZWFuc3dyKSwgIWlzLm5hKGdvZHZveGFsb3VkKSwKICAgICAgICAgbW9yZXF1ZXNtb3JlYW5zd3IgIT0gIk90aGVyIiwgZ29kdm94YWxvdWQgIT0gIk90aGVyIikgJT4lCiAgZ2dwbG90KGFlcyh4ID0gbW9yZXF1ZXNtb3JlYW5zd3IsIGFscGhhID0gZ29kdm94YWxvdWQsIGZpbGwgPSByZXNlYXJjaGVyKSkgKwogIGZhY2V0X2dyaWQodXJiYW5fcnVyYWwgfiBjaGFyaXNtYXRpY19sb2NhbCB+IGNvdW50cnkpICsKICBnZW9tX2Jhcihwb3NpdGlvbiA9ICJmaWxsIikgKwogIGdlb21fdGV4dChkYXRhID0gbW9yZXF1ZXNtb3JlYW5zd3JfY291bnRfYnlfcXVhZCwKICAgICAgICAgICAgYWVzKHggPSBtb3JlcXVlc21vcmVhbnN3ciwgeSA9IDEsIGFscGhhID0gTlVMTCwgZmlsbCA9IE5VTEwsCiAgICAgICAgICAgICAgICBsYWJlbCA9IHBhc3RlMCgiKG49IiwgbiwgIikiKSksCiAgICAgICAgICAgIHNpemUgPSAyLCBudWRnZV95ID0gMC4wNSkgKwogICMgc2NhbGVfZmlsbF9icmV3ZXIoZ3VpZGUgPSBOVUxMLCBwYWxldHRlID0gIkRhcmsyIikgKwogIHNjYWxlX2ZpbGxfbWFudWFsKGd1aWRlID0gTlVMTCwgdmFsdWVzID0gY3VzdG9tX3BhbCkgKwogIHNjYWxlX2FscGhhX2Rpc2NyZXRlKHJhbmdlID0gYygwLjUsIDEpKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCAxLCAwLjI1KSkgKwogIGxhYnModGl0bGUgPSBwYXN0ZSgibW9yZXF1ZXNtb3JlYW5zd3IiLCAiZ29kdm94YWxvdWQiLCBzZXAgPSAiIHggIiksCiAgICAgICBzdWJ0aXRsZSA9ICJFeGNsdWRpbmcgcGVvcGxlIHdobyBkaWQgbm90IGhhdmUgYSBjbGVhciBhbnN3ZXIiLAogICAgICAgeCA9ICJtb3JlcXVlc21vcmVhbnN3ciIsCiAgICAgICB5ID0gIlByb3BvcnRpb24iLAogICAgICAgYWxwaGEgPSAiZ29kdm94YWxvdWQiLAogICAgICAgZmlsbCA9ICJSZXNlYXJjaGVyIikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiLAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIGhqdXN0ID0gMSwgdmp1c3QgPSAwLjUpKSArCiAgZ3VpZGVzKGFscGhhID0gZ3VpZGVfbGVnZW5kKCksCiAgICAgICAgIGZpbGwgPSAibm9uZSIpCmBgYAoKYGBge3IsIGZpZy53aWR0aCA9IDQsIGZpZy5hc3AgPSAwLjV9CmQgJT4lCiAgZmlsdGVyKCFpcy5uYShtb3JlcXVlc21vcmVhbnN3ciksICFpcy5uYShnb2R2b3hhbG91ZCksCiAgICAgICAgIG1vcmVxdWVzbW9yZWFuc3dyICE9ICJPdGhlciIsIGdvZHZveGFsb3VkICE9ICJPdGhlciIpICU+JQogIGdncGxvdChhZXMoeCA9IG1vcmVxdWVzbW9yZWFuc3dyLCBhbHBoYSA9IGdvZHZveGFsb3VkLCBmaWxsID0gY291bnRyeSkpICsKICBmYWNldF9ncmlkKC4gfiBjb3VudHJ5KSArCiAgZ2VvbV9iYXIocG9zaXRpb24gPSAiZmlsbCIpICsKICBnZW9tX3RleHQoZGF0YSA9IG1vcmVxdWVzbW9yZWFuc3dyX2NvdW50LAogICAgICAgICAgICBhZXMoeCA9IG1vcmVxdWVzbW9yZWFuc3dyLCB5ID0gMSwgYWxwaGEgPSBOVUxMLCBmaWxsID0gTlVMTCwKICAgICAgICAgICAgICAgIGxhYmVsID0gcGFzdGUwKCIobj0iLCBuLCAiKSIpKSwKICAgICAgICAgICAgc2l6ZSA9IDIsIG51ZGdlX3kgPSAwLjA1KSArCiAgc2NhbGVfZmlsbF9icmV3ZXIoZ3VpZGUgPSBOVUxMLCBwYWxldHRlID0gIkRhcmsyIikgKwogICMgc2NhbGVfZmlsbF9tYW51YWwoZ3VpZGUgPSBOVUxMLCB2YWx1ZXMgPSBjdXN0b21fcGFsKSArCiAgc2NhbGVfYWxwaGFfZGlzY3JldGUocmFuZ2UgPSBjKDAuNSwgMSkpICsKICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDEsIDAuMjUpKSArCiAgbGFicyh0aXRsZSA9IHBhc3RlKCJtb3JlcXVlc21vcmVhbnN3ciIsICJnb2R2b3hhbG91ZCIsIHNlcCA9ICIgeCAiKSwKICAgICAgIHN1YnRpdGxlID0gIkV4Y2x1ZGluZyBwZW9wbGUgd2hvIGRpZCBub3QgaGF2ZSBhIGNsZWFyIGFuc3dlciIsCiAgICAgICB4ID0gIm1vcmVxdWVzbW9yZWFuc3dyIiwKICAgICAgIHkgPSAiUHJvcG9ydGlvbiIsCiAgICAgICBhbHBoYSA9ICJnb2R2b3hhbG91ZCIsCiAgICAgICBmaWxsID0gIlJlc2VhcmNoZXIiKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInRvcCIsCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgaGp1c3QgPSAxLCB2anVzdCA9IDAuNSkpICsKICBndWlkZXMoYWxwaGEgPSBndWlkZV9sZWdlbmQoKSwKICAgICAgICAgZmlsbCA9ICJub25lIikKYGBgCgpgYGB7cn0KZDcgPC0gZCAlPiUKICBmaWx0ZXIoIWlzLm5hKG1vcmVxdWVzbW9yZWFuc3dyKSwgIWlzLm5hKGdvZHZveGFsb3VkKSwKICAgICAgICAgbW9yZXF1ZXNtb3JlYW5zd3IgIT0gIk90aGVyIiwgZ29kdm94YWxvdWQgIT0gIk90aGVyIikgJT4lCiAgbXV0YXRlKG1vcmVxdWVzbW9yZWFuc3dyID0gZmFjdG9yKG1vcmVxdWVzbW9yZWFuc3dyKSwKICAgICAgICAgbW9yZXF1ZXNtb3JlYW5zd3JfbnVtID0gYXMubnVtZXJpYyhtb3JlcXVlc21vcmVhbnN3cikgLSAxLAogICAgICAgICBnb2R2b3hhbG91ZCA9IGZhY3Rvcihnb2R2b3hhbG91ZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoIk5vIiwgIlllcyIpKSwKICAgICAgICAgZ29kdm94YWxvdWRfbnVtID0gYXMubnVtZXJpYyhnb2R2b3hhbG91ZCkgLSAxKSAlPiUKICBzZWxlY3QoY291bnRyeSwgcmVzZWFyY2hlciwgdXJiYW5fcnVyYWwsIGNoYXJpc21hdGljX2xvY2FsLCBzdWJqZWN0X25hbWUsCiAgICAgICAgIHN0YXJ0c193aXRoKCJtb3JlcXVlc21vcmVhbnN3ciIpLCBzdGFydHNfd2l0aCgiZ29kdm94YWxvdWQiKSkKCmNvbnRyYXN0cyhkNyRjb3VudHJ5KSA8LSBjYmluZCgiR0giID0gYygtMSwgMSwgMCwgMCwgMCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVEgiID0gYygtMSwgMCwgMSwgMCwgMCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0giID0gYygtMSwgMCwgMCwgMSwgMCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlQiID0gYygtMSwgMCwgMCwgMCwgMSkpCmNvbnRyYXN0cyhkNyRtb3JlcXVlc21vcmVhbnN3cikgPC0gY2JpbmQoIlEiID0gYygxLCAtMSkpCgpyNyA8LSBnbG0oZ29kdm94YWxvdWRfbnVtIH4gbW9yZXF1ZXNtb3JlYW5zd3IgKyBjb3VudHJ5LAogICAgICAgICAgICAgICAgICBmYW1pbHkgPSAiYmlub21pYWwiLCBkYXRhID0gZDcpCnN1bW1hcnkocjcpCmBgYAoKIyMjIFNwaXJpdHVhbCBleHBlcmllbmNlcyBpbmRleGVkIGJ5IGBnb2R2aWF2aXNpb25zYApfU29tZSBwZW9wbGUgc2F5IHRoYXQgdGhleSBoYXZlIGhhZCBhIHZpc2lvbiBmcm9tIEdvZCrigJR0aGV5IGhhdmUgYSBwaWN0dXJlLCBidXQgaXQgaXMgbGlrZSB0aGV5IHNlZSBpdCB3aXRoIHRoZWlyIGV5ZXMuIEhhcyBhbnl0aGluZyBsaWtlIHRoYXQgaGFwcGVuZWQgdG8geW91P18KCmBgYHtyLCBmaWcud2lkdGggPSAzLCBmaWcuYXNwID0gMX0KZCAlPiUKICBmaWx0ZXIoIWlzLm5hKG1vcmVxdWVzbW9yZWFuc3dyKSwgIWlzLm5hKGdvZHZpYXZpc2lvbnMpKSAlPiUgIywKICAgICAgICAgIyBtb3JlcXVlc21vcmVhbnN3ciAhPSAiT3RoZXIiLCBnb2R2aWF2aXNpb25zICE9ICJPdGhlciIpICU+JQogIGdncGxvdChhZXMoeCA9IG1vcmVxdWVzbW9yZWFuc3dyLCB5ID0gZ29kdmlhdmlzaW9ucywgY29sb3IgPSByZXNlYXJjaGVyKSkgKwogIGZhY2V0X2dyaWQodXJiYW5fcnVyYWwgfiBjaGFyaXNtYXRpY19sb2NhbCB+IGNvdW50cnkpICsKICBnZW9tX3BvaW50KGFscGhhID0gMC4zLCBwb3NpdGlvbiA9IHBvc2l0aW9uX2ppdHRlcigwLjIsIDAuMikpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gY3VzdG9tX3BhbCkgKwogIGxhYnModGl0bGUgPSBwYXN0ZSgibW9yZXF1ZXNtb3JlYW5zd3IiLCAiZ29kdmlhdmlzaW9ucyIsIHNlcCA9ICIgeCAiKSwKICAgICAgICMgc3VidGl0bGUgPSAiRXhjbHVkaW5nIHBlb3BsZSB3aG8gZGlkIG5vdCBoYXZlIGEgY2xlYXIgYW5zd2VyIiwKICAgICAgIHggPSAibW9yZXF1ZXNtb3JlYW5zd3IiLAogICAgICAgeSA9ICJnb2R2aWF2aXNpb25zIiwKICAgICAgIGNvbG9yID0gIlJlc2VhcmNoZXIiKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInRvcCIsCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgaGp1c3QgPSAxLCB2anVzdCA9IDAuNSkpICsKICBndWlkZXMoY29sb3IgPSBndWlkZV9sZWdlbmQobmNvbCA9IDYsIGJ5cm93ID0gVFJVRSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJyaWRlLmFlcyA9IGxpc3QoYWxwaGEgPSAxKSkpCmBgYAoKYGBge3IsIGZpZy53aWR0aCA9IDQsIGZpZy5hc3AgPSAxfQpkICU+JQogIGZpbHRlcighaXMubmEobW9yZXF1ZXNtb3JlYW5zd3IpLCAhaXMubmEoZ29kdmlhdmlzaW9ucyksCiAgICAgICAgIG1vcmVxdWVzbW9yZWFuc3dyICE9ICJPdGhlciIsIGdvZHZpYXZpc2lvbnMgIT0gIk90aGVyIikgJT4lCiAgZ2dwbG90KGFlcyh4ID0gbW9yZXF1ZXNtb3JlYW5zd3IsIGFscGhhID0gZ29kdmlhdmlzaW9ucywgZmlsbCA9IHJlc2VhcmNoZXIpKSArCiAgZmFjZXRfZ3JpZCh1cmJhbl9ydXJhbCB+IGNoYXJpc21hdGljX2xvY2FsIH4gY291bnRyeSkgKwogIGdlb21fYmFyKHBvc2l0aW9uID0gImZpbGwiKSArCiAgZ2VvbV90ZXh0KGRhdGEgPSBtb3JlcXVlc21vcmVhbnN3cl9jb3VudF9ieV9xdWFkLAogICAgICAgICAgICBhZXMoeCA9IG1vcmVxdWVzbW9yZWFuc3dyLCB5ID0gMSwgYWxwaGEgPSBOVUxMLCBmaWxsID0gTlVMTCwKICAgICAgICAgICAgICAgIGxhYmVsID0gcGFzdGUwKCIobj0iLCBuLCAiKSIpKSwKICAgICAgICAgICAgc2l6ZSA9IDIsIG51ZGdlX3kgPSAwLjA1KSArCiAgIyBzY2FsZV9maWxsX2JyZXdlcihndWlkZSA9IE5VTEwsIHBhbGV0dGUgPSAiRGFyazIiKSArCiAgc2NhbGVfZmlsbF9tYW51YWwoZ3VpZGUgPSBOVUxMLCB2YWx1ZXMgPSBjdXN0b21fcGFsKSArCiAgc2NhbGVfYWxwaGFfZGlzY3JldGUocmFuZ2UgPSBjKDAuNSwgMSkpICsKICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDEsIDAuMjUpKSArCiAgbGFicyh0aXRsZSA9IHBhc3RlKCJtb3JlcXVlc21vcmVhbnN3ciIsICJnb2R2aWF2aXNpb25zIiwgc2VwID0gIiB4ICIpLAogICAgICAgc3VidGl0bGUgPSAiRXhjbHVkaW5nIHBlb3BsZSB3aG8gZGlkIG5vdCBoYXZlIGEgY2xlYXIgYW5zd2VyIiwKICAgICAgIHggPSAibW9yZXF1ZXNtb3JlYW5zd3IiLAogICAgICAgeSA9ICJQcm9wb3J0aW9uIiwKICAgICAgIGFscGhhID0gImdvZHZpYXZpc2lvbnMiLAogICAgICAgZmlsbCA9ICJSZXNlYXJjaGVyIikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiLAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIGhqdXN0ID0gMSwgdmp1c3QgPSAwLjUpKSArCiAgZ3VpZGVzKGFscGhhID0gZ3VpZGVfbGVnZW5kKCksCiAgICAgICAgIGZpbGwgPSAibm9uZSIpCmBgYAoKYGBge3IsIGZpZy53aWR0aCA9IDQsIGZpZy5hc3AgPSAwLjV9CmQgJT4lCiAgZmlsdGVyKCFpcy5uYShtb3JlcXVlc21vcmVhbnN3ciksICFpcy5uYShnb2R2aWF2aXNpb25zKSwKICAgICAgICAgbW9yZXF1ZXNtb3JlYW5zd3IgIT0gIk90aGVyIiwgZ29kdmlhdmlzaW9ucyAhPSAiT3RoZXIiKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBtb3JlcXVlc21vcmVhbnN3ciwgYWxwaGEgPSBnb2R2aWF2aXNpb25zLCBmaWxsID0gY291bnRyeSkpICsKICBmYWNldF9ncmlkKC4gfiBjb3VudHJ5KSArCiAgZ2VvbV9iYXIocG9zaXRpb24gPSAiZmlsbCIpICsKICBnZW9tX3RleHQoZGF0YSA9IG1vcmVxdWVzbW9yZWFuc3dyX2NvdW50LAogICAgICAgICAgICBhZXMoeCA9IG1vcmVxdWVzbW9yZWFuc3dyLCB5ID0gMSwgYWxwaGEgPSBOVUxMLCBmaWxsID0gTlVMTCwKICAgICAgICAgICAgICAgIGxhYmVsID0gcGFzdGUwKCIobj0iLCBuLCAiKSIpKSwKICAgICAgICAgICAgc2l6ZSA9IDIsIG51ZGdlX3kgPSAwLjA1KSArCiAgc2NhbGVfZmlsbF9icmV3ZXIoZ3VpZGUgPSBOVUxMLCBwYWxldHRlID0gIkRhcmsyIikgKwogICMgc2NhbGVfZmlsbF9tYW51YWwoZ3VpZGUgPSBOVUxMLCB2YWx1ZXMgPSBjdXN0b21fcGFsKSArCiAgc2NhbGVfYWxwaGFfZGlzY3JldGUocmFuZ2UgPSBjKDAuNSwgMSkpICsKICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDEsIDAuMjUpKSArCiAgbGFicyh0aXRsZSA9IHBhc3RlKCJtb3JlcXVlc21vcmVhbnN3ciIsICJnb2R2aWF2aXNpb25zIiwgc2VwID0gIiB4ICIpLAogICAgICAgc3VidGl0bGUgPSAiRXhjbHVkaW5nIHBlb3BsZSB3aG8gZGlkIG5vdCBoYXZlIGEgY2xlYXIgYW5zd2VyIiwKICAgICAgIHggPSAibW9yZXF1ZXNtb3JlYW5zd3IiLAogICAgICAgeSA9ICJQcm9wb3J0aW9uIiwKICAgICAgIGFscGhhID0gImdvZHZpYXZpc2lvbnMiLAogICAgICAgZmlsbCA9ICJSZXNlYXJjaGVyIikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiLAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIGhqdXN0ID0gMSwgdmp1c3QgPSAwLjUpKSArCiAgZ3VpZGVzKGFscGhhID0gZ3VpZGVfbGVnZW5kKCksCiAgICAgICAgIGZpbGwgPSAibm9uZSIpCmBgYAoKYGBge3J9CmQ4IDwtIGQgJT4lCiAgZmlsdGVyKCFpcy5uYShtb3JlcXVlc21vcmVhbnN3ciksICFpcy5uYShnb2R2aWF2aXNpb25zKSwKICAgICAgICAgbW9yZXF1ZXNtb3JlYW5zd3IgIT0gIk90aGVyIiwgZ29kdmlhdmlzaW9ucyAhPSAiT3RoZXIiKSAlPiUKICBtdXRhdGUobW9yZXF1ZXNtb3JlYW5zd3IgPSBmYWN0b3IobW9yZXF1ZXNtb3JlYW5zd3IpLAogICAgICAgICBtb3JlcXVlc21vcmVhbnN3cl9udW0gPSBhcy5udW1lcmljKG1vcmVxdWVzbW9yZWFuc3dyKSAtIDEsCiAgICAgICAgIGdvZHZpYXZpc2lvbnMgPSBmYWN0b3IoZ29kdmlhdmlzaW9ucywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoIk5vIiwgIlllcyIpKSwKICAgICAgICAgZ29kdmlhdmlzaW9uc19udW0gPSBhcy5udW1lcmljKGdvZHZpYXZpc2lvbnMpIC0gMSkgJT4lCiAgc2VsZWN0KGNvdW50cnksIHJlc2VhcmNoZXIsIHVyYmFuX3J1cmFsLCBjaGFyaXNtYXRpY19sb2NhbCwgc3ViamVjdF9uYW1lLAogICAgICAgICBzdGFydHNfd2l0aCgibW9yZXF1ZXNtb3JlYW5zd3IiKSwgc3RhcnRzX3dpdGgoImdvZHZpYXZpc2lvbnMiKSkKCmNvbnRyYXN0cyhkOCRjb3VudHJ5KSA8LSBjYmluZCgiR0giID0gYygtMSwgMSwgMCwgMCwgMCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVEgiID0gYygtMSwgMCwgMSwgMCwgMCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0giID0gYygtMSwgMCwgMCwgMSwgMCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlQiID0gYygtMSwgMCwgMCwgMCwgMSkpCmNvbnRyYXN0cyhkOCRtb3JlcXVlc21vcmVhbnN3cikgPC0gY2JpbmQoIlEiID0gYygxLCAtMSkpCgpyOCA8LSBnbG0oZ29kdmlhdmlzaW9uc19udW0gfiBtb3JlcXVlc21vcmVhbnN3ciArIGNvdW50cnksCiAgICAgICAgICAgICAgICAgIGZhbWlseSA9ICJiaW5vbWlhbCIsIGRhdGEgPSBkOCkKc3VtbWFyeShyOCkKYGBgCgojIyMgU3Bpcml0dWFsIGV4cGVyaWVuY2VzIGluZGV4ZWQgYnkgYGdvZHZpYWJvZHlleHBlcmllbmNlc2AKX1NvbWUgcGVvcGxlIGhhdmUgcGFydGljdWxhciBleHBlcmllbmNlcyBpbiB5b3VyIGJvZHkgdGhhdCB0aGV5IGFzc29jaWF0ZSB3aXRoIEdvZCogb3Igc3Bpcml0LiBEb2VzIHRoYXQgaGFwcGVuIGZvciB5b3U/IFtleGFtcGxlczogd2FybSBoYW5kcywgZ29vc2VidW1wcywgZmlyZSBpbiB0aGUgYmVsbHldXwoKYGBge3IsIGZpZy53aWR0aCA9IDMsIGZpZy5hc3AgPSAxfQpkICU+JQogIGZpbHRlcighaXMubmEobW9yZXF1ZXNtb3JlYW5zd3IpLCAhaXMubmEoZ29kdmlhYm9keWV4cGVyaWVuY2VzKSkgJT4lICMsCiAgICAgICAgICMgbW9yZXF1ZXNtb3JlYW5zd3IgIT0gIk90aGVyIiwgZ29kdmlhYm9keWV4cGVyaWVuY2VzICE9ICJPdGhlciIpICU+JQogIGdncGxvdChhZXMoeCA9IG1vcmVxdWVzbW9yZWFuc3dyLCB5ID0gZ29kdmlhYm9keWV4cGVyaWVuY2VzLCBjb2xvciA9IHJlc2VhcmNoZXIpKSArCiAgZmFjZXRfZ3JpZCh1cmJhbl9ydXJhbCB+IGNoYXJpc21hdGljX2xvY2FsIH4gY291bnRyeSkgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjMsIHBvc2l0aW9uID0gcG9zaXRpb25faml0dGVyKDAuMiwgMC4yKSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjdXN0b21fcGFsKSArCiAgbGFicyh0aXRsZSA9IHBhc3RlKCJtb3JlcXVlc21vcmVhbnN3ciIsICJnb2R2aWFib2R5ZXhwZXJpZW5jZXMiLCBzZXAgPSAiIHggIiksCiAgICAgICAjIHN1YnRpdGxlID0gIkV4Y2x1ZGluZyBwZW9wbGUgd2hvIGRpZCBub3QgaGF2ZSBhIGNsZWFyIGFuc3dlciIsCiAgICAgICB4ID0gIm1vcmVxdWVzbW9yZWFuc3dyIiwKICAgICAgIHkgPSAiZ29kdmlhYm9keWV4cGVyaWVuY2VzIiwKICAgICAgIGNvbG9yID0gIlJlc2VhcmNoZXIiKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInRvcCIsCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgaGp1c3QgPSAxLCB2anVzdCA9IDAuNSkpICsKICBndWlkZXMoY29sb3IgPSBndWlkZV9sZWdlbmQobmNvbCA9IDYsIGJ5cm93ID0gVFJVRSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJyaWRlLmFlcyA9IGxpc3QoYWxwaGEgPSAxKSkpCmBgYAoKYGBge3IsIGZpZy53aWR0aCA9IDQsIGZpZy5hc3AgPSAxfQpkICU+JQogIGZpbHRlcighaXMubmEobW9yZXF1ZXNtb3JlYW5zd3IpLCAhaXMubmEoZ29kdmlhYm9keWV4cGVyaWVuY2VzKSwKICAgICAgICAgbW9yZXF1ZXNtb3JlYW5zd3IgIT0gIk90aGVyIiwgZ29kdmlhYm9keWV4cGVyaWVuY2VzICE9ICJPdGhlciIpICU+JQogIGdncGxvdChhZXMoeCA9IG1vcmVxdWVzbW9yZWFuc3dyLCBhbHBoYSA9IGdvZHZpYWJvZHlleHBlcmllbmNlcywgZmlsbCA9IHJlc2VhcmNoZXIpKSArCiAgZmFjZXRfZ3JpZCh1cmJhbl9ydXJhbCB+IGNoYXJpc21hdGljX2xvY2FsIH4gY291bnRyeSkgKwogIGdlb21fYmFyKHBvc2l0aW9uID0gImZpbGwiKSArCiAgZ2VvbV90ZXh0KGRhdGEgPSBtb3JlcXVlc21vcmVhbnN3cl9jb3VudF9ieV9xdWFkLAogICAgICAgICAgICBhZXMoeCA9IG1vcmVxdWVzbW9yZWFuc3dyLCB5ID0gMSwgYWxwaGEgPSBOVUxMLCBmaWxsID0gTlVMTCwKICAgICAgICAgICAgICAgIGxhYmVsID0gcGFzdGUwKCIobj0iLCBuLCAiKSIpKSwKICAgICAgICAgICAgc2l6ZSA9IDIsIG51ZGdlX3kgPSAwLjA1KSArCiAgIyBzY2FsZV9maWxsX2JyZXdlcihndWlkZSA9IE5VTEwsIHBhbGV0dGUgPSAiRGFyazIiKSArCiAgc2NhbGVfZmlsbF9tYW51YWwoZ3VpZGUgPSBOVUxMLCB2YWx1ZXMgPSBjdXN0b21fcGFsKSArCiAgc2NhbGVfYWxwaGFfZGlzY3JldGUocmFuZ2UgPSBjKDAuNSwgMSkpICsKICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDEsIDAuMjUpKSArCiAgbGFicyh0aXRsZSA9IHBhc3RlKCJtb3JlcXVlc21vcmVhbnN3ciIsICJnb2R2aWFib2R5ZXhwZXJpZW5jZXMiLCBzZXAgPSAiIHggIiksCiAgICAgICBzdWJ0aXRsZSA9ICJFeGNsdWRpbmcgcGVvcGxlIHdobyBkaWQgbm90IGhhdmUgYSBjbGVhciBhbnN3ZXIiLAogICAgICAgeCA9ICJtb3JlcXVlc21vcmVhbnN3ciIsCiAgICAgICB5ID0gIlByb3BvcnRpb24iLAogICAgICAgYWxwaGEgPSAiZ29kdmlhYm9keWV4cGVyaWVuY2VzIiwKICAgICAgIGZpbGwgPSAiUmVzZWFyY2hlciIpICsKICB0aGVtZV9idygpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIiwKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCBoanVzdCA9IDEsIHZqdXN0ID0gMC41KSkgKwogIGd1aWRlcyhhbHBoYSA9IGd1aWRlX2xlZ2VuZCgpLAogICAgICAgICBmaWxsID0gIm5vbmUiKQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSA0LCBmaWcuYXNwID0gMC41fQpkICU+JQogIGZpbHRlcighaXMubmEobW9yZXF1ZXNtb3JlYW5zd3IpLCAhaXMubmEoZ29kdmlhYm9keWV4cGVyaWVuY2VzKSwKICAgICAgICAgbW9yZXF1ZXNtb3JlYW5zd3IgIT0gIk90aGVyIiwgZ29kdmlhYm9keWV4cGVyaWVuY2VzICE9ICJPdGhlciIpICU+JQogIGdncGxvdChhZXMoeCA9IG1vcmVxdWVzbW9yZWFuc3dyLCBhbHBoYSA9IGdvZHZpYWJvZHlleHBlcmllbmNlcywgZmlsbCA9IGNvdW50cnkpKSArCiAgZmFjZXRfZ3JpZCguIH4gY291bnRyeSkgKwogIGdlb21fYmFyKHBvc2l0aW9uID0gImZpbGwiKSArCiAgZ2VvbV90ZXh0KGRhdGEgPSBtb3JlcXVlc21vcmVhbnN3cl9jb3VudCwKICAgICAgICAgICAgYWVzKHggPSBtb3JlcXVlc21vcmVhbnN3ciwgeSA9IDEsIGFscGhhID0gTlVMTCwgZmlsbCA9IE5VTEwsCiAgICAgICAgICAgICAgICBsYWJlbCA9IHBhc3RlMCgiKG49IiwgbiwgIikiKSksCiAgICAgICAgICAgIHNpemUgPSAyLCBudWRnZV95ID0gMC4wNSkgKwogIHNjYWxlX2ZpbGxfYnJld2VyKGd1aWRlID0gTlVMTCwgcGFsZXR0ZSA9ICJEYXJrMiIpICsKICAjIHNjYWxlX2ZpbGxfbWFudWFsKGd1aWRlID0gTlVMTCwgdmFsdWVzID0gY3VzdG9tX3BhbCkgKwogIHNjYWxlX2FscGhhX2Rpc2NyZXRlKHJhbmdlID0gYygwLjUsIDEpKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCAxLCAwLjI1KSkgKwogIGxhYnModGl0bGUgPSBwYXN0ZSgibW9yZXF1ZXNtb3JlYW5zd3IiLCAiZ29kdmlhYm9keWV4cGVyaWVuY2VzIiwgc2VwID0gIiB4ICIpLAogICAgICAgc3VidGl0bGUgPSAiRXhjbHVkaW5nIHBlb3BsZSB3aG8gZGlkIG5vdCBoYXZlIGEgY2xlYXIgYW5zd2VyIiwKICAgICAgIHggPSAibW9yZXF1ZXNtb3JlYW5zd3IiLAogICAgICAgeSA9ICJQcm9wb3J0aW9uIiwKICAgICAgIGFscGhhID0gImdvZHZpYWJvZHlleHBlcmllbmNlcyIsCiAgICAgICBmaWxsID0gIlJlc2VhcmNoZXIiKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInRvcCIsCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgaGp1c3QgPSAxLCB2anVzdCA9IDAuNSkpICsKICBndWlkZXMoYWxwaGEgPSBndWlkZV9sZWdlbmQoKSwKICAgICAgICAgZmlsbCA9ICJub25lIikKYGBgCgpgYGB7cn0KZDkgPC0gZCAlPiUKICBmaWx0ZXIoIWlzLm5hKG1vcmVxdWVzbW9yZWFuc3dyKSwgIWlzLm5hKGdvZHZpYWJvZHlleHBlcmllbmNlcyksCiAgICAgICAgIG1vcmVxdWVzbW9yZWFuc3dyICE9ICJPdGhlciIsIGdvZHZpYWJvZHlleHBlcmllbmNlcyAhPSAiT3RoZXIiKSAlPiUKICBtdXRhdGUobW9yZXF1ZXNtb3JlYW5zd3IgPSBmYWN0b3IobW9yZXF1ZXNtb3JlYW5zd3IpLAogICAgICAgICBtb3JlcXVlc21vcmVhbnN3cl9udW0gPSBhcy5udW1lcmljKG1vcmVxdWVzbW9yZWFuc3dyKSAtIDEsCiAgICAgICAgIGdvZHZpYWJvZHlleHBlcmllbmNlcyA9IGZhY3Rvcihnb2R2aWFib2R5ZXhwZXJpZW5jZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJObyIsICJZZXMiKSksCiAgICAgICAgIGdvZHZpYWJvZHlleHBlcmllbmNlc19udW0gPSBhcy5udW1lcmljKGdvZHZpYWJvZHlleHBlcmllbmNlcykgLSAxKSAlPiUKICBzZWxlY3QoY291bnRyeSwgcmVzZWFyY2hlciwgdXJiYW5fcnVyYWwsIGNoYXJpc21hdGljX2xvY2FsLCBzdWJqZWN0X25hbWUsCiAgICAgICAgIHN0YXJ0c193aXRoKCJtb3JlcXVlc21vcmVhbnN3ciIpLCBzdGFydHNfd2l0aCgiZ29kdmlhYm9keWV4cGVyaWVuY2VzIikpCgpjb250cmFzdHMoZDkkY291bnRyeSkgPC0gY2JpbmQoIkdIIiA9IGMoLTEsIDEsIDAsIDAsIDApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRIIiA9IGMoLTEsIDAsIDEsIDAsIDApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNIIiA9IGMoLTEsIDAsIDAsIDEsIDApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZUIiA9IGMoLTEsIDAsIDAsIDAsIDEpKQpjb250cmFzdHMoZDkkbW9yZXF1ZXNtb3JlYW5zd3IpIDwtIGNiaW5kKCJRIiA9IGMoMSwgLTEpKQoKcjkgPC0gZ2xtKGdvZHZpYWJvZHlleHBlcmllbmNlc19udW0gfiBtb3JlcXVlc21vcmVhbnN3ciArIGNvdW50cnksCiAgICAgICAgICAgICAgICAgIGZhbWlseSA9ICJiaW5vbWlhbCIsIGRhdGEgPSBkOSkKc3VtbWFyeShyOSkKYGBgCgojIEFic29ycHRpb24gJiBzcGlyaXR1YWwgZXhwZXJpZW5jZXMKCiMjIyBBZ2dyZWdhdGUgc3Bpcml0dWFsIGV4cGVyaWVuY2VzIHNjb3JlCgpgYGB7ciwgZmlnLndpZHRoID0gMywgZmlnLmFzcCA9IDF9CmRfc3Bpcml0ICU+JQogIGZpbHRlcighaXMubmEoYWJzX3Njb3JlKSwgIWlzLm5hKHNwZXhfc2NvcmUpKSAlPiUKICBkaXN0aW5jdChjb3VudHJ5LCByZXNlYXJjaGVyLCB1cmJhbl9ydXJhbCwgY2hhcmlzbWF0aWNfbG9jYWwsCiAgICAgICAgICAgc3ViamVjdF9uYW1lLCBhYnNfc2NvcmUsIHNwZXhfc2NvcmUpICU+JQogIGdncGxvdChhZXMoeCA9IGFic19zY29yZSwgeSA9IHNwZXhfc2NvcmUsIGNvbG9yID0gcmVzZWFyY2hlcikpICsKICBmYWNldF9ncmlkKHVyYmFuX3J1cmFsIH4gY2hhcmlzbWF0aWNfbG9jYWwgfiBjb3VudHJ5KSArCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuMywgcG9zaXRpb24gPSBwb3NpdGlvbl9qaXR0ZXIoMC4yLCAwKSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjdXN0b21fcGFsKSArCiAgbGFicyh0aXRsZSA9IHBhc3RlKCJhYnNfc2NvcmUiLCAic3BleF9zY29yZSIsIHNlcCA9ICIgeCAiKSwKICAgICAgICMgc3VidGl0bGUgPSAiRXhjbHVkaW5nIHBlb3BsZSB3aG8gZGlkIG5vdCBoYXZlIGEgY2xlYXIgYW5zd2VyIiwKICAgICAgIHggPSAiYWJzX3Njb3JlIiwKICAgICAgIHkgPSAic3BleF9zY29yZSIsCiAgICAgICBjb2xvciA9ICJSZXNlYXJjaGVyIikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiLAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIGhqdXN0ID0gMSwgdmp1c3QgPSAwLjUpKSArCiAgZ3VpZGVzKGNvbG9yID0gZ3VpZGVfbGVnZW5kKG5jb2wgPSA2LCBieXJvdyA9IFRSVUUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVycmlkZS5hZXMgPSBsaXN0KGFscGhhID0gMSkpKQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSAzLCBmaWcuYXNwID0gMC42fQpkX3NwaXJpdCAlPiUKICBmaWx0ZXIoIWlzLm5hKGFic19zY29yZSksICFpcy5uYShzcGV4X3Njb3JlKSkgJT4lCiAgZGlzdGluY3QoY291bnRyeSwgcmVzZWFyY2hlciwgdXJiYW5fcnVyYWwsIGNoYXJpc21hdGljX2xvY2FsLAogICAgICAgICAgIHN1YmplY3RfbmFtZSwgYWJzX3Njb3JlLCBzcGV4X3Njb3JlKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBhYnNfc2NvcmUsIHkgPSBzcGV4X3Njb3JlLCAKICAgICAgICAgICAgIGNvbG9yID0gY291bnRyeSwgZmlsbCA9IGNvdW50cnksIGdyb3VwID0gY291bnRyeSkpICsKICBmYWNldF9ncmlkKC4gfiBjb3VudHJ5KSArCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuMywgcG9zaXRpb24gPSBwb3NpdGlvbl9qaXR0ZXIoMC4yLCAwKSkgKwogIGdlb21fc21vb3RoKGFlcyh4ID0gYXMubnVtZXJpYyhhYnNfc2NvcmUpKSwgbWV0aG9kID0gImxtIikgKwogICMgZ2VvbV9zbW9vdGgoYWVzKHggPSBhcy5udW1lcmljKGFic19zY29yZSkpLCBtZXRob2QgPSAibG9lc3MiKSArCiAgIyBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gY3VzdG9tX3BhbCkgKwogICMgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gY3VzdG9tX3BhbCkgKwogIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlID0gIkRhcmsyIikgKwogIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAiRGFyazIiKSArCiAgbGFicyh0aXRsZSA9IHBhc3RlKCJhYnNfc2NvcmUiLCAic3BleF9zY29yZSIsIHNlcCA9ICIgeCAiKSwKICAgICAgICMgc3VidGl0bGUgPSAiRXhjbHVkaW5nIHBlb3BsZSB3aG8gZGlkIG5vdCBoYXZlIGEgY2xlYXIgYW5zd2VyIiwKICAgICAgIHggPSAiYWJzX3Njb3JlIiwKICAgICAgIHkgPSAic3BleF9zY29yZSIsCiAgICAgICBjb2xvciA9ICJSZXNlYXJjaGVyIiwgZmlsbCA9ICJSZXNlYXJjaGVyIikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiLAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIGhqdXN0ID0gMSwgdmp1c3QgPSAwLjUpKSArCiAgZ3VpZGVzKGNvbG9yID0gZ3VpZGVfbGVnZW5kKG5jb2wgPSA2LCBieXJvdyA9IFRSVUUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVycmlkZS5hZXMgPSBsaXN0KGFscGhhID0gMSkpLAogICAgICAgICBmaWxsID0gZ3VpZGVfbGVnZW5kKG5jb2wgPSA2LCBieXJvdyA9IFRSVUUpKQpgYGAKCmBgYHtyfQpkX2FnZzIgPC0gZF9zcGlyaXQgJT4lCiAgZmlsdGVyKCFpcy5uYShhYnNfc2NvcmUpLCAhaXMubmEoc3BleF9zY29yZSksCiAgICAgICAgIGFic19zY29yZSAhPSAiT3RoZXIiLCBzcGV4X3Njb3JlICE9ICJPdGhlciIpICU+JQogICMgZGlzdGluY3QoY291bnRyeSwgcmVzZWFyY2hlciwgdXJiYW5fcnVyYWwsIGNoYXJpc21hdGljX2xvY2FsLAogICMgICAgICAgICAgc3ViamVjdF9uYW1lLCBhYnNfc2NvcmUsIHNwZXhfc2NvcmUpICU+JQogIG11dGF0ZShhYnNfc2NvcmVfbnVtID0gYXMubnVtZXJpYyhhYnNfc2NvcmUpIC0gMSkgIyAlPiUKICAjIHNlbGVjdChjb3VudHJ5LCByZXNlYXJjaGVyLCB1cmJhbl9ydXJhbCwgY2hhcmlzbWF0aWNfbG9jYWwsIHN1YmplY3RfbmFtZSwKICAjICAgICAgICBzdGFydHNfd2l0aCgiYWJzX3Njb3JlIiksIHN0YXJ0c193aXRoKCJzcGV4X3Njb3JlIikpCgpjb250cmFzdHMoZF9hZ2cyJGNvdW50cnkpIDwtIGNiaW5kKCJHSCIgPSBjKC0xLCAxLCAwLCAwLCAwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUSCIgPSBjKC0xLCAwLCAxLCAwLCAwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDSCIgPSBjKC0xLCAwLCAwLCAxLCAwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVCIgPSBjKC0xLCAwLCAwLCAwLCAxKSkKCnJfYWdnMyA8LSBsbWVyKHJlc3BvbnNlIH4gc2NhbGUoYWJzX3Njb3JlLCBzY2FsZSA9IEYpICsgY291bnRyeSAKICAgICAgICAgICAgICAgKyAoMSB8IHN1YmplY3RfbmFtZSkgKyAoMSB8IHF1ZXN0aW9uKSwgCiAgICAgICAgICAgICAgIGRhdGEgPSBkX2FnZzIpCnN1bW1hcnkocl9hZ2czKQoKcl9hZ2c0IDwtIGxtZXIocmVzcG9uc2UgfiBzY2FsZShhYnNfc2NvcmUsIHNjYWxlID0gRikgKiBjb3VudHJ5IAogICAgICAgICAgICAgICArICgxIHwgc3ViamVjdF9uYW1lKSArICgxIHwgcXVlc3Rpb24pLCAKICAgICAgICAgICAgICAgZGF0YSA9IGRfYWdnMikKc3VtbWFyeShyX2FnZzQpCgphbm92YShyX2FnZzMsIHJfYWdnNCkKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gMywgZmlnLmFzcCA9IDAuNn0KZF9yX2FnZzNfcHJlZGljdGVkIDwtIGRfYWdnMiAlPiUKICBtdXRhdGUocmVzcG9uc2VfcHJlZCA9IHByZWRpY3Qocl9hZ2czLCBkX2FnZzIpKSAlPiUKICBncm91cF9ieShzdWJqZWN0X25hbWUpICU+JQogIG11dGF0ZShzcGV4X3Njb3JlX3ByZWQgPSBzdW0ocmVzcG9uc2VfcHJlZCwgbmEucm0gPSBUKSkgJT4lCiAgdW5ncm91cCgpICU+JQogIGdyb3VwX2J5KGNvdW50cnksIGFic19zY29yZSkgJT4lCiAgZG8oZGF0YS5mcmFtZShyYmluZChzbWVhbi5jbC5ib290KC4kc3BleF9zY29yZV9wcmVkKSkpKQoKZF9zcGlyaXQgJT4lCiAgZmlsdGVyKCFpcy5uYShhYnNfc2NvcmUpLCAhaXMubmEoc3BleF9zY29yZSkpICU+JQogIGRpc3RpbmN0KGNvdW50cnksIHJlc2VhcmNoZXIsIHVyYmFuX3J1cmFsLCBjaGFyaXNtYXRpY19sb2NhbCwKICAgICAgICAgICBzdWJqZWN0X25hbWUsIGFic19zY29yZSwgc3BleF9zY29yZSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gYWJzX3Njb3JlLCB5ID0gc3BleF9zY29yZSwgCiAgICAgICAgICAgICBjb2xvciA9IGNvdW50cnksIGZpbGwgPSBjb3VudHJ5LCBncm91cCA9IGNvdW50cnkpKSArCiAgZmFjZXRfZ3JpZCguIH4gY291bnRyeSkgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjMsIHBvc2l0aW9uID0gcG9zaXRpb25faml0dGVyKDAuMiwgMCkpICsKICBnZW9tX2xpbmUoZGF0YSA9IGRfcl9hZ2czX3ByZWRpY3RlZCwgYWVzKHkgPSBNZWFuKSkgKwogIGdlb21fcmliYm9uKGRhdGEgPSBkX3JfYWdnM19wcmVkaWN0ZWQsIAogICAgICAgICAgICAgIGFlcyh5bWluID0gTG93ZXIsIHltYXggPSBVcHBlciwgeSA9IE5VTEwpLCAKICAgICAgICAgICAgICBhbHBoYSA9IDAuNSwgc2l6ZSA9IDApICsKICAjIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjdXN0b21fcGFsKSArCiAgIyBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjdXN0b21fcGFsKSArCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGUgPSAiRGFyazIiKSArCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIpICsKICBsYWJzKHRpdGxlID0gcGFzdGUoImFic19zY29yZSIsICJzcGV4X3Njb3JlIiwgc2VwID0gIiB4ICIpLAogICAgICAgc3VidGl0bGUgPSAiTGluZXMgYXJlIHByZWRpY3Rpb25zIGZyb20gYSBtaXhlZCBlZmZlY3RzIGxpbmVhciByZWdyZXNzaW9uOlxubG1lcihyZXNwb25zZSB+IGFic19zY29yZSArIGNvdW50cnkgKyAoMSB8IHN1YmplY3RfbmFtZSkgKyAoMSB8IHF1ZXN0aW9uKSIsCiAgICAgICB4ID0gImFic19zY29yZSIsCiAgICAgICB5ID0gInNwZXhfc2NvcmUiLAogICAgICAgY29sb3IgPSAiU2l0ZSIsIGZpbGwgPSAiU2l0ZSIpICsKICB0aGVtZV9idygpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIiwKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCBoanVzdCA9IDEsIHZqdXN0ID0gMC41KSkgKwogIGd1aWRlcyhjb2xvciA9ICJub25lIiwKICAgICAgICAgZmlsbCA9ICJub25lIikKYGBgCgojIyMgTG9va2luZyBqdXN0IGF0ICdhcHBsZXMnICh1cmJhbiBjaGFyaXNtYXRpY3MpCgpgYGB7ciwgZmlnLndpZHRoID0gMywgZmlnLmFzcCA9IDAuNX0KZF9zcGlyaXQgJT4lCiAgZmlsdGVyKCFpcy5uYShhYnNfc2NvcmUpLCAhaXMubmEoc3BleF9zY29yZSksCiAgICAgICAgIHF1YWQgPT0gInVyYmFuIGNoYXJpc21hdGljIikgJT4lCiAgZGlzdGluY3QoY291bnRyeSwgcmVzZWFyY2hlciwgY2hhcmlzbWF0aWNfbG9jYWwsIHVyYmFuX3J1cmFsLCAKICAgICAgICAgICBzdWJqZWN0X25hbWUsIGFic19zY29yZSwgc3BleF9zY29yZSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gYWJzX3Njb3JlLCB5ID0gc3BleF9zY29yZSwgCiAgICAgICAgICAgICBjb2xvciA9IGNvdW50cnksIGZpbGwgPSBjb3VudHJ5LCBncm91cCA9IGNvdW50cnkpKSArCiAgZmFjZXRfZ3JpZChjaGFyaXNtYXRpY19sb2NhbCB+IHVyYmFuX3J1cmFsIH4gY291bnRyeSkgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjMsIHBvc2l0aW9uID0gcG9zaXRpb25faml0dGVyKDAuMiwgMCkpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iKSArCiAgIyBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gY3VzdG9tX3BhbCkgKwogICMgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gY3VzdG9tX3BhbCkgKwogIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlID0gIkRhcmsyIikgKwogIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAiRGFyazIiKSArCiAgbGFicyh0aXRsZSA9IHBhc3RlKCJhYnNfc2NvcmUiLCAic3BleF9zY29yZSIsIHNlcCA9ICIgeCAiKSwKICAgICAgICMgc3VidGl0bGUgPSAiTGluZXMgYXJlIHByZWRpY3Rpb25zIGZyb20gYSBtaXhlZCBlZmZlY3RzIGxpbmVhciByZWdyZXNzaW9uOlxubG1lcihyZXNwb25zZSB+IGFic19zY29yZSArIGNvdW50cnkgKyAoMSB8IHN1YmplY3RfbmFtZSkgKyAoMSB8IHF1ZXN0aW9uKSIsCiAgICAgICB4ID0gImFic19zY29yZSIsCiAgICAgICB5ID0gInNwZXhfc2NvcmUiLAogICAgICAgY29sb3IgPSAiU2l0ZSIsIGZpbGwgPSAiU2l0ZSIpICsKICB0aGVtZV9idygpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIiwKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCBoanVzdCA9IDEsIHZqdXN0ID0gMC41KSkgKwogIGd1aWRlcyhjb2xvciA9ICJub25lIiwKICAgICAgICAgZmlsbCA9ICJub25lIikKYGBgCgojIyMgTG9va2luZyBhdCBhbGwgY2hhcmlzbWF0aWNzCgpgYGB7ciwgZmlnLndpZHRoID0gMywgZmlnLmFzcCA9IDAuNX0KZF9zcGlyaXQgJT4lCiAgZmlsdGVyKCFpcy5uYShhYnNfc2NvcmUpLCAhaXMubmEoc3BleF9zY29yZSksCiAgICAgICAgIGNoYXJpc21hdGljX2xvY2FsID09ICJjaGFyaXNtYXRpYyIpICU+JQogIGRpc3RpbmN0KGNvdW50cnksIHJlc2VhcmNoZXIsIGNoYXJpc21hdGljX2xvY2FsLCB1cmJhbl9ydXJhbCwgCiAgICAgICAgICAgc3ViamVjdF9uYW1lLCBhYnNfc2NvcmUsIHNwZXhfc2NvcmUpICU+JQogIGdncGxvdChhZXMoeCA9IGFic19zY29yZSwgeSA9IHNwZXhfc2NvcmUsIAogICAgICAgICAgICAgY29sb3IgPSBjb3VudHJ5LCBmaWxsID0gY291bnRyeSwgZ3JvdXAgPSBjb3VudHJ5KSkgKwogIGZhY2V0X2dyaWQoY2hhcmlzbWF0aWNfbG9jYWwgfiBjb3VudHJ5KSArCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuMywgcG9zaXRpb24gPSBwb3NpdGlvbl9qaXR0ZXIoMC4yLCAwKSkgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIpICsKICAjIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjdXN0b21fcGFsKSArCiAgIyBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjdXN0b21fcGFsKSArCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGUgPSAiRGFyazIiKSArCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIpICsKICBsYWJzKHRpdGxlID0gcGFzdGUoImFic19zY29yZSIsICJzcGV4X3Njb3JlIiwgc2VwID0gIiB4ICIpLAogICAgICAgIyBzdWJ0aXRsZSA9ICJMaW5lcyBhcmUgcHJlZGljdGlvbnMgZnJvbSBhIG1peGVkIGVmZmVjdHMgbGluZWFyIHJlZ3Jlc3Npb246XG5sbWVyKHJlc3BvbnNlIH4gYWJzX3Njb3JlICsgY291bnRyeSArICgxIHwgc3ViamVjdF9uYW1lKSArICgxIHwgcXVlc3Rpb24pIiwKICAgICAgIHggPSAiYWJzX3Njb3JlIiwKICAgICAgIHkgPSAic3BleF9zY29yZSIsCiAgICAgICBjb2xvciA9ICJTaXRlIiwgZmlsbCA9ICJTaXRlIikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiLAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIGhqdXN0ID0gMSwgdmp1c3QgPSAwLjUpKSArCiAgZ3VpZGVzKGNvbG9yID0gIm5vbmUiLAogICAgICAgICBmaWxsID0gIm5vbmUiKQpgYGAKCiMgVG8gZG8KCkhlcmUgYXJlIG90aGVyIHRoaW5ncyBvbiBvdXIgdG8tZG8gbGlzdDoKCi0gRXhwZXJpZW5jZXMgYnkgc2Vuc2UgKEpvc2gpCi0gRXh0cmVtaXR5IG9mIGV4cGVyaWVuY2VzIChKb3NoKQotIC4uLgo=